在代码中设置静态资源
本文关键字:静态 资源 设置 代码 | 更新日期: 2023-09-27 18:31:40
我的App.xaml
文件中有几种样式:
<SolidColorBrush x:Key="styleBlue" Color="#FF4B77BE"/>
<SolidColorBrush x:Key="styleRed" Color="#FFF64747"/>
<SolidColorBrush x:Key="styleOrange" Color="#FFF89406"/>
<SolidColorBrush x:Key="styleGreen" Color="#FF1BBC9B"/>
<SolidColorBrush x:Key="styleYellow" Color="#FFF9BF3B"/>
<Style x:Key="stackpanelBackground" TargetType="StackPanel">
<Setter Property="Background" Value="{StaticResource styleBlue}"/>
</Style>
我想更改mainpage.xaml.cs
代码中的BackgroundProperty
。
我尝试使用这个:
Style style = Application.Current.Resources["stackpanelBackground"] as Style;
style.Setters.SetValue(StackPanel.BackgroundProperty, "{StaticResource styleRed}");
但是我得到了一个灾难性的故障异常。我认为这与{StaticResource styleRed}
有关.有没有更好的方法可以做到这一点?
StaticResource
是静态的。应用程序编译后,无法更改它们。
为此,有DynamicResource
:
DynamicResource 将在初始编译期间创建一个临时表达式,从而推迟对资源的查找,直到实际需要请求的资源值来构造对象。
另请注意,您可以使用 FindResource
更好地找到对其他资源的引用。尝试这样的事情(完整的工作示例):
在MainPage.xaml
:
<Window.Resources>
<Color R="255" x:Key="styleRed" />
<Style x:Key="abc" TargetType="StackPanel">
<Setter Property="Background" Value="Blue" />
</Style>
</Window.Resources>
在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;
}
}
为什么要修改样式而不是直接设置目标StackPanel
的Background
-属性?由于"本地值"的优先级高于"样式资源库",因此将使用从代码隐藏写入Background
方法:
(1) 为您的堆栈面板x:Name="spBla"
命名
(2)将画笔分配给spBla
的Background
(类似于spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush;
)
您可以在此处了解有关值优先级的更多信息:
http://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx
XAML 资源
<Window.Resources>
<LinearGradientBrush x:Key="GrayBlueGardientBrush"
StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="DarkCyan" Offset="0"/>
<GradientStop Color="#CCCCFF" Offset="0.5"/>
<GradientStop Color="DarkCyan" Offset="1"/>
</LinearGradientBrush>
</Window.Resources>
.CS
private void Button_Click(object sender, RoutedEventArgs e)
{
var r = this.FindResource("GrayBlueGardientBrush");
(sender as Button).Background = r as LinearGradientBrush;
}
如果我理解正确,您希望设置一种样式,该样式仅允许您更改特定的堆栈面板,因此您不必全部设置它们。试试这个建议(注意:这是一个建议,我还没有测试过它,但希望它的方向是正确的)
<SolidColorBrush x:Key="styleBlue" Color="#FF4B77BE"/>
<SolidColorBrush x:Key="styleRed" Color="#FFF64747"/>
<SolidColorBrush x:Key="styleOrange" Color="#FFF89406"/>
<SolidColorBrush x:Key="styleGreen" Color="#FF1BBC9B"/>
<SolidColorBrush x:Key="styleYellow" Color="#FFF9BF3B"/>
<Style x:Key="stackpanelBackground" TargetType="StackPanel">
<Setter Property="Background" Value="{Binding Background, FallbackValue={StaticResource styleBlue}}"/>
</Style>
或者尝试使用模板绑定而不是绑定,就像我说的这是一个建议,我还没有测试过它。这将为你提供背景的绑定,以及尚未为其设置背景颜色的堆栈面板的回退值。让我知道这如何或是否适合您:)