2009-11-18 64 views
1

我想让我的应用程序中的子窗口从父窗口继承WPF依赖项属性。WPF窗口是否可以从它的所有者窗口继承属性值?

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

我希望能够简单地改变主窗口中的渲染模式,并改变应适用于整个应用程序。

回答

1

如果你想一次设置它,离开它,只需添加样式到您的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中,如果你使用的是窗口的子类,而不是简单的Window对象不起作用。

要允许您定义要应用到所有窗口的子类的风格,下面OverrideMetadata呼叫添加到您的应用程序的构造函数(通常在App.xaml.cs)在InitializeComponent():

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

不幸的是,单一样式似乎不起作用 - 它仅适用于“窗口”类型,但我的窗口正在使用派生自Window的类。 如果我为派生类指定了x:Type,该样式可以正常工作 - 但它的功能与为每个窗口类和每个要继承的属性手动设置绑定一样有效。 – Daniel

+0

对不起,我忘了解决方案的一小部分:要做到这一点,您必须对Window进行StyleProperty元数据覆盖或使用主题。我会更新我的答案。 –

相关问题