在代码中设置静态资源

我的App.xaml文件中有几个样式:

         

我想在mainpage.xaml.cs的代码中更改BackgroundProperty

我试过用这个:

 Style style = Application.Current.Resources["stackpanelBackground"] as Style; style.Setters.SetValue(StackPanel.BackgroundProperty, "{StaticResource styleRed}"); 

但我遇到了灾难性的失败exception。 我认为它与{StaticResource styleRed} 。 有一个更好的方法吗?

StaticResource是静态的。 应用程序编译后,您无法更改它们。

为此,有DynamicResource

DynamicResource将在初始编译期间创建临时表达式,从而推迟查找资源,直到实际需要所请求的资源值才能构造对象。

另请注意,您可以使用FindResource更好地找到对其他资源的引用。 尝试这样的事情(完整的工作样本):

MainPage.xaml

     

MainPage.xaml.cs

 Style style = this.FindResource("abc") as Style; var r = this.FindResource("styleRed"); foreach (Setter s in style.Setters) { if (s.Property == StackPanel.BackgroundProperty) { s.Value = r; } } 

为什么要修改样式而不是直接设置目标StackPanelBackground -Property? 由于’Local value’的优先级高于’Style setters’,因此您将使用从后面的代码写入Background的值

手段:

(1)给你的stackpanel x:Name="spBla"

(2)将画笔分配给spBlaBackground (类似于spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush;

您可以在此处了解有关值优先级的更多信息:

http://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx

如果我理解正确,您想要设置一个样式,只允许您更改特定的堆栈面板,因此您不必全部设置它们。 试试这个建议(注意:这是一个建议,我没有测试过,但希望它是在正确的方向)

       

或者尝试使用TemplateBinding而不是Binding,就像我说这是一个建议而我没有测试过。 这将为您提供背景绑定,以及未设置背景颜色的stackpanel的回退值。 让我知道这对你是否有用:)

Interesting Posts