代码之家  ›  专栏  ›  技术社区  ›  Daniel

WPF窗口能否从其所有者窗口继承属性值?

  •  1
  • Daniel  · 技术社区  · 16 年前

    如果我在我的主窗口(我使用的是WPF 4)上设置TextOptions.TextRenderingMode=“ClearType”,该值将应用于该窗口的所有子控件。 如何使这些值也应用于所有子窗口?(所有者设置为“我的主窗口”的窗口实例)

    我希望能够简单地更改主窗口上的渲染模式,并且更改应该应用于整个应用程序。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Ray Burns    16 年前

    如果您想设置一次并保留它,只需在您的App.xaml中添加一个样式即可 <ResourceDictionary>

    <ResourceDictionary>
      ...
      <Style TargetType="{x:Type Window}">
        <Setter Property="TextOptions.RenderingMode" Value="ClearType">
      </Style>
      ...
    </ResourceDictionary>
    

    如果您确实希望能够随时间变化,可以绑定到主窗口:

    <ResourceDictionary>
      ...
      <Style TargetType="{x:Type Window}">
        <Setter Property="TextOptions.RenderingMode" Value="{Binding MainWindow.(TextOptions.RenderingMode), Source="{x:Static Application.Current}">
      </Style>
      ...
    </ResourceDictionary>
    

    并确保在主窗口中明确设置,以避免自引用:

    <Window TextOptions.RenderingMode="ClearType" ...>
    

    现在,对主窗口的TextOptions.RenderingMode的任何动态更改也将影响所有其他窗口。但对于大多数目的来说,简单的固定样式是最好的。

    如果您不关心它是否由主窗口的值控制,那么还有其他动态绑定它的解决方案,例如,您可以使用 {DynamicResource ...}

    更新

    要允许您定义的样式应用于所有窗口子类,请向应用程序的构造函数(通常在App.xaml.cs中)添加以下OverrideMetadata调用 之后

    public App()
    {
      InitializeComponent();
      FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata
      {
        DefaultValue = FindResource(typeof(Window))
      });
    }
    
        2
  •  0
  •   Anton    16 年前

    你可以使用 style resource 将同一属性赋予多个窗口。