如何在生命周期中改变控制的风格

时间:2016-11-15 10:22:03

标签: c# xaml uwp win-universal-app

让我们假设我们有一个控件,它在Resources中设置了自己的样式:

<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()方法,使控件查找样式并再次应用它。

任何想法如何以干净的方式做?样式存储在ResourceDictionaries中,它必须保持这种方式。如何更改/修改它们然后强制控件应用新样式?

请注意,创建var style = new Style();然后手动添加style.AddValue(...);并设置control.Style = style;对我来说不是解决方案。我有太多的风格和太多的控件。

编辑: 请注意2:我使用的是UWP,而不是WPF,因此所有基于DynamicResource的解决方案都不适用于我

1 个答案:

答案 0 :(得分:0)

主要思想是为许多目标样式设置1个密钥(例如,对于按钮控件,例如x:key="ButtonStyleKey"),您应该有一个或多个资源字典(xaml文件)以不同的方式定义该密钥。当你需要更改样式时,你必须在你的(页面,窗口小部件......你正在使用的UIElement中)重新加载你的资源字典

<强>更新

您可以执行以下操作:

var resDictionary = new ResourceDictionary();
resDictionary.Source = new Uri("CustomResourceDictionary.xaml",UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(resDictionary);

我还要提到的是,只有ThemeResource(WPF中的DynamicResource)才会进行更改。 StaticResources没有。

<Button Content="Test label" Style="{ThemeResource ButtonStyle}"/>