C# 如何从应用程序访问命名资源。代码隐藏中的资源?

C# 如何从应用程序访问命名资源。代码隐藏中的资源?,c#,silverlight,C#,Silverlight,在这个Silverlight应用程序中,我试图从MainPage类中的application.Resources访问资源。资源具有x:Name属性,而不是x:Key 我知道我可以使用以下代码行从应用程序分配键控资源。资源: grid1.Background=(LinearGradientBrush)Application.Current.Resources[“KeyedTwoColorGradient”]; 使用此逻辑,我尝试将命名资源分配给我的grid1.Background,并使用: gr

在这个Silverlight应用程序中,我试图从MainPage类中的application.Resources访问资源。资源具有x:Name属性,而不是x:Key

我知道我可以使用以下代码行从应用程序分配键控资源。资源:

grid1.Background=(LinearGradientBrush)Application.Current.Resources[“KeyedTwoColorGradient”];
使用此逻辑,我尝试将命名资源分配给我的grid1.Background,并使用:

grid1.Background=((LinearGradientBrush)Application.Current).Resources.NamedTwoColorGradient;
这行代码给了我一个错误: 无法将类型“System.Windows.Application”转换为“System.Windows.Media.LinearGradientBrush”

我也尝试过不同的路线,但没有任何效果。我在其他地方找不到答案,所以我来这里问这个问题


另外,有人能告诉我什么时候使用命名资源合适,什么时候使用Keyed更好吗?

首先,在示例中,您的括号放错了位置(您实际上是将应用程序对象强制转换为LinearBrush),例如:

但“正确”语法将自动完成,但不会编译:

(Application.Current as App).KeyedTwoColorGradient;
问题在于,与用户控件不同,App.xaml没有与designer.cs等效的名称,因此命名成员仅对intellisense可见,但实际上没有代码隐藏属性。


您应该只对资源使用密钥。

我明白了。非常感谢。我对C#还是很陌生,对Silverlight甚至更新,但这篇文章对我帮助很大。我已经意识到我应该避免资源命名,而更喜欢键控。+1但是语法甚至没有“自动完成”,只有在App.g.I.cs文件中自动生成
KeyedTwoColorGradient
字段时,它才会自动完成。然而,这并没有发生,因为“App.xaml”上的构建操作是“ApplicationDefinition”,它不会为命名元素创建字段。@AnthonyWJones:显然,intellisense可以单独处理xaml,因为它会自动完成,但我确实有ReSharper,它可能会帮助我:)@HiTech:也许,我不使用ReSharper,所以这可能是不同之处。在我的测试中,App.xaml中的名字没有任何这样的智能感知。Resharper是否试图补偿intellisense在代码背后要求保存xaml文件以使其完整?@AnthonyWJones:那么必须是Resharper。它有某种超智能的感觉,所以比普通的能找到更多的信息。干杯
(Application.Current as App).KeyedTwoColorGradient;