【问题标题】:How to change control's style during its lifetime如何在其生命周期内更改控件的样式
【发布时间】:2017-03-29 04:31:38
【问题描述】:

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

<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 的解决方案都不适用于我

【问题讨论】:

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


【解决方案1】:

主要思想是为许多目标样式设置 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)会进行更改。静态资源编号

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

【讨论】:

  • 重新加载资源字典是什么意思?我有 2 个资源字典,每个都定义了相同的键,当我使用此键设置控件样式时,它使用最后一个定义的字典中的一个。
  • @RTDev 请你看看我的更新。这可能会有所帮助:)
  • 希望你的意思是除此之外的任何东西 ;) 它不会更新我的布局 - UWP 中没有 DynamicResource :(
  • hmmm 动态资源在 WPF 中:D。让我们试着找到一个等价物
  • 嘿@RTDev 我猜(根据我的快速阅读)ThemeResource 相当于 WPF 中的 DynamicResource。所以你可以使用它
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多