C# 如何更改控件';s的风格在它的一生中

C# 如何更改控件';s的风格在它的一生中,c#,xaml,uwp,win-universal-app,C#,Xaml,Uwp,Win Universal App,假设有一个控件在参考资料中设置了自己的样式: <Page.Resources> <Style TargetType="Button" x:Key="ButtonStyle"> <Setter Property="Background" Value="Red"/> <Setter Property="FontSize" Value="20"/> </Style> </Page.Reso

假设有一个控件在参考资料中设置了自己的样式:

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

有什么办法可以用干净的方式做吗?样式存储在ResourceDictionary中,并且必须保持这种方式。如何更改/修改它们,然后强制控件应用新样式

请注意,创建var style=newstyle();然后手动添加style.AddValue(…);和设置控件。样式=样式;这不是我的解决办法。我有太多的风格和太多的控制

编辑:
请注意2:我使用的是UWP,而不是WPF,因此基于DynamicSource的所有解决方案对我来说都不起作用。主要思想是对于许多目标样式使用一个键(例如,对于按钮控件使用
x:Key=“ButtonStyleKey”
),并且应该有一个或多个资源字典(xaml文件)以不同的方式定义该键。当您需要更改样式时,您必须在(页面、窗口小部件..您正在使用的
UIElement
中重新加载资源字典)

更新

您可以执行以下操作:

var resDictionary = new ResourceDictionary();
resDictionary.Source = new Uri("CustomResourceDictionary.xaml",UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(resDictionary);
我还必须提到,只有meresource(WPF中的DynamicResource)将接受这些更改。资源编号

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


我在UWPW中没有DynamicSource,重新加载资源字典是什么意思?我有两个资源字典,每个都定义了相同的键,当我使用此键设置控件的样式时,它使用的是上一个定义的字典中的一个。@RTDev请查看我的更新。这可能会有帮助:)希望你的意思是除此之外的任何东西;)它不会更新我的布局-UWP中没有DynamicSource:(hmmm Dynamic resources在WPF:D中。让我们试着找到一个等价的他们@RTDev,我猜(从我的快速阅读中)是WPF中DynamicSource的等价物。所以你可以使用它