【问题标题】:Can a WPF window inherit property values from its owner window?WPF 窗口可以从其所有者窗口继承属性值吗?
【发布时间】:2009-11-18 17:46:44
【问题描述】:

我希望我的应用程序中的子窗口从其父窗口继承 WPF 依赖项属性。

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

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

【问题讨论】:

    标签: c# wpf dependency-properties


    【解决方案1】:

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

    <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 ...} 或绑定到静态对象的属性。

    更新

    如果您使用的是 Window 子类而不是普通的 Window 对象,则仅在 App.xaml 中为 Window 添加样式是行不通的。

    要允许您定义的样式应用于所有 Window 子类,请将以下 OverrideMetadata 调用添加到您应用的构造函数(通常在 App.xaml.cs 中) InitializeComponent() 之后: p>

    public App()
    {
      InitializeComponent();
      FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata
      {
        DefaultValue = FindResource(typeof(Window))
      });
    }
    

    【讨论】:

    • 不幸的是,单一样式似乎不起作用 - 它仅适用于“Window”类型,但我的窗口使用的是从 Window 派生的类。如果我为派生类指定 x:Type,则样式可以正常工作 - 但它与为每个窗口类和我想要继承的每个属性手动设置绑定一样多。
    • 抱歉,我忘记了一小部分解决方案:要完成这项工作,您必须为 Window 执行 StyleProperty 元数据覆盖或使用主题。我会更新我的答案。
    【解决方案2】:

    您可以使用style resource 将相同的属性赋予多个窗口。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2023-03-26
      • 2017-06-23
      • 2014-06-12
      • 2014-10-12
      • 1970-01-01
      • 2010-10-07
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多