C# 在代码隐藏中动态更改 XAML 样式,以便应用该样式的控件也反映更改
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10345166/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Changing XAML style dynamically in Code Behind so that controls applying that style also reflect the change
提问by Nikhil Agrawal
I want to be able to set style properties (and values) from the .cs file in my WPF window.
我希望能够从 WPF 窗口中的 .cs 文件设置样式属性(和值)。
My problem is if I have 30 rectangles, all of which I want to have the same style (and I don't want to update all of them individually). I'd like to have them all set (in the xaml file) to the same style, and then update the style to look the way I'd like.
我的问题是,如果我有 30 个矩形,我希望所有这些矩形都具有相同的样式(并且我不想单独更新它们)。我想让它们(在 xaml 文件中)都设置为相同的样式,然后更新样式以使其看起来像我想要的样子。
Say I set the Style = "key1"in the Xaml for each rectangle. Then I want to be able to modify "key1" later so all the rectangles will reflect that change.
假设我Style = "key1"在 Xaml 中为每个矩形设置了。然后我希望能够稍后修改“key1”,以便所有矩形都会反映该更改。
I tried in App.xaml
我试过 App.xaml
<Application.Resources>
<Style x:Key="key1" TargetType="Rectangle">
<Setter Property="Fill" Value="Red"/>
</Style>
</Application.Resources>
In MainwWindows.xaml
在 MainwWindows.xaml 中
<StackPanel>
<Rectangle Style="{StaticResource key1}" Height="200" Width="200" x:Name="rect1"/>
<Button Click="Button_Click" Content="Click"/>
</StackPanel>
In code behind
在后面的代码中
private void Button_Click(object sender, RoutedEventArgs e)
{
Style style = Application.Current.Resources["key1"] as Style;
style.Setters.Add(new Setter(Rectangle.VisibilityProperty, Visibility.Collapsed));
}
This updates the style but do not update the rectangles.
这会更新样式但不会更新矩形。
Is this possible? Does anyone know how to do this? (An example would be greatly appreciated).
这可能吗?有谁知道如何做到这一点?(一个例子将不胜感激)。
采纳答案by Phil
You need to use DynamicResourceso that it can be changed at run-time. You also need to replacethe style with a new one, not try to modify the existing one. This works:
您需要使用DynamicResource它才能在运行时更改它。您还需要用新样式替换样式,而不是尝试修改现有样式。这有效:
<StackPanel>
<Rectangle Style="{DynamicResource key1}" Height="200" Width="200" x:Name="rect1"/>
<Button Click="Button_Click" Content="Click"/>
</StackPanel>
Style style = new Style {TargetType = typeof(Rectangle)};
style.Setters.Add(new Setter(Shape.FillProperty, Brushes.Red));
style.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed));
Application.Current.Resources["key1"] = style;
回答by Ahmad
It is also worth mentioning that styles are sealed once used and hence can not be changed. This is the reason why styles should be replaced by another instance rather than updated.
还值得一提的是,样式一旦使用就被密封,因此无法更改。这就是为什么样式应该被另一个实例替换而不是更新的原因。
回答by Nick Kovalsky
Created some static helpers, usage example:
创建了一些静态助手,用法示例:
SetStyle(typeof(ContentPage),
(ContentPage.BackgroundColorProperty, Color.Green),
(ContentPage.PaddingProperty, new Thickness(20)));
Helper methods:
辅助方法:
public static Style CreateStyle(Type target, params (BindableProperty property, object value)[] setters)
{
Style style = new Style(target);
style.ApplyToDerivedTypes = true;
foreach (var setter in setters)
{
style.Setters.Add(new Setter
{
Property = setter.property,
Value = setter.value
});
}
return style;
}
public static void SetStyle(Type target, params (BindableProperty property, object value)[] setters)
{
Style style = new Style(target);
style.ApplyToDerivedTypes = true;
foreach (var setter in setters)
{
style.Setters.Add(new Setter
{
Property = setter.property,
Value = setter.value
});
}
Application.Current.Resources.Add(style);
}

