如何在控件的生命周期内改变它的样式
本文关键字:改变 样式 周期 生命 控件 | 更新日期: 2023-09-27 18:18:09
让我们假设我们有一个控件,它在资源中有自己的样式集:
<Page.Resources>
<Style TargetType="Button" x:Key="ButtonStyle">
<Setter Property="Background" Value="Red"/>
<Setter Property="FontSize" Value="20"/>
</Style>
</Page.Resources>
<Grid>
<Button Content="Test label" Style="{StaticResource ButtonStyle}"/>
</Grid>
问题:例如,当控件已经显示在布局上时,我想让用户决定按钮背景应该具有哪种背景颜色。
xaml中的编辑样式将不起作用,因为它必须重新应用到控件-它是StaticResource,所以它永远不会这样做。有没有办法强制控件重新应用样式?
在代码中设置样式也不起作用,除非有一种方法可以获得现有的样式并只更改一个属性,而不是手动复制/设置它们。不要认为在我有多个控件的情况下以这种方式重新应用样式是个好主意。
理想的方法:1)从ResourceDictionary中获取样式2)更改此样式中的一个属性3)调用control . refreshstyle()方法,该方法将使控件查找样式并再次应用它。
有什么干净的方法吗?样式存储在resourcedtionary中,并且必须保持这种方式。如何更改/修改它们,然后强制控件应用新样式?
请注意,创建var style = new style ();然后手动添加style.AddValue(…);设置控制。Style = Style;对我来说不是解决办法。我有太多的样式和太多的控件。
编辑:请注意2:我使用的是UWP,而不是WPF,所以所有基于DynamicResource的解决方案都不适用于我
主要思想是为许多目标样式提供一个键(让我们说例如按钮控件的x:key="ButtonStyleKey"
),并且您应该有一个或多个资源字典(xaml文件)以不同的方式定义该键。当你需要改变样式时,你必须在你的页面、窗口小部件中重新加载你的资源字典。不管你用的是什么UIElement
)
你可以这样做:
var resDictionary = new ResourceDictionary();
resDictionary.Source = new Uri("CustomResourceDictionary.xaml",UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(resDictionary);
我还必须提到,只有themerresource (WPF中的DynamicResource)会接受这些更改。StaticResources没有。
<Button Content="Test label" Style="{ThemeResource ButtonStyle}"/>