2009-11-18 65 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元數據覆蓋或使用主題。我會更新我的答案。 –

相關問題