我想要更新的默认窗口式在运行时动态所以我可以改变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;
}

有几个问题,这种办法,我有几个问题为什么事情是他们的方式。

  1. 为什么款式密封在运行以及是否有办法使得它们不密封?
  2. 当我重新添加的新的风格,这是为什么没有拾起我所有的窗户?为什么我要去手动把它应用到每一个窗口?
  3. 是否有一个更好的办法?
有帮助吗?

解决方案

我可能会解决这一"设置服务",其公开性质的各种设置,以及火灾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将选择和改变窗口特性。

似乎是一个很大的工作,但是它给你一些很好的灵活性,以及所有的"繁重"做纯粹是利用绑定。我们使用类似的技术上的一个项目,我现在在忙,所以当一个用户选择填充/中风的色彩的各种工具,该工具条的更新以反映新的价值观。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top