WPF窗口是否可以从其所有者窗口继承属性值?

时间:2009-11-18 17:46:44

标签: c# wpf dependency-properties

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

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

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

2 个答案:

答案 0 :(得分: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子类,请在 InitializeComponent()之后将以下OverrideMetadata调用添加到App的构造函数(通常在App.xaml.cs中)

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

答案 1 :(得分:0)

您可以使用style resource为多个窗口提供相同的属性。