WPF更新的样式在运行
-
21-09-2019 - |
题
我想要更新的默认窗口式在运行时动态所以我可以改变FontSize和FontFamily动态在运行时间。我发现那样在资源的字典中被密封在运行时并不能改变的,所以我用下述方法的更新风格:
<Style TargetType="{x:Type Window}">
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="12pt"/>
</Style>
下列代码:
Style newStyle = (Make a copy of the old style but with the FontSize and FontFamily changed)
// Remove and re-add the style to the ResourceDictionary.
this.Resources.Remove(typeof(Window));
this.Resources.Add(typeof(Window), newStyle);
// The style does not update unless you set it on each window.
foreach (Window window in Application.Current.Windows)
{
window.Style = newStyle;
}
有几个问题,这种办法,我有几个问题为什么事情是他们的方式。
- 为什么款式密封在运行以及是否有办法使得它们不密封?
- 当我重新添加的新的风格,这是为什么没有拾起我所有的窗户?为什么我要去手动把它应用到每一个窗口?
- 是否有一个更好的办法?
解决方案
我可能会解决这一"设置服务",其公开性质的各种设置,以及火灾INPC为你会为正常结合。接下来,我会改变风格的东西,如:
<Style x:Key="MyWindowStyle">
<Setter Property="FontFamily" Value="{Binding Path=FontFamily, Source={StaticResource SettingsService}, FallbackValue=Arial}"/>
<Setter Property="FontSize" Value="{Binding Path=FontSize, Source={StaticResource SettingsService}, FallbackValue=12}"/>
</Style>
你的"设置服务"的定义作为静态资源:
<services:SettingsService x:Key="SettingsService"/>
然后在每个窗口,确保风格被设置为一个DynamicResource:
<Window Style="{DynamicResource MyWindowStyle}" .... >
有的往往是一个很大的误解周围的差异之间的静态和动态资源,但基本差异是静态的,是"一个时间"设定,而动态将更新的设置,如果资源的变化。
现在如果你设置的那些性质在你的"设置服务"他们会火INPC,其中将更新的风格,其中DynamicResource将选择和改变窗口特性。
似乎是一个很大的工作,但是它给你一些很好的灵活性,以及所有的"繁重"做纯粹是利用绑定。我们使用类似的技术上的一个项目,我现在在忙,所以当一个用户选择填充/中风的色彩的各种工具,该工具条的更新以反映新的价值观。
不隶属于 StackOverflow