2012-09-06 29 views
2

可以說我想將我的應用程序中所有StackPanel的背景設置爲某種顏色。 我得到了我的App.xaml如下:Style.TargetType,對話框和子類化WPF控件

<Style TargetType="StackPanel"> 
    <Setter Property="Background" Value="#222222" /> 
</Style> 

這隻會工作,如果StackPanel的是一個純粹的StackPanel和StackPanel中必須在應用程序下。但是,彈出對話框中的StackPanel或StackPanel的子類的背景顏色不會因此而改變。例如:

public class MyStackPanel : StackPanel { ... } 

解決子類問題的一種方法是擴展UserControl,並將StackPanel嵌入到UserControl中。只要您不需要訪問StackPanel的屬性,就可以。

有什麼想法?

做WPF主題最好的方法是什麼?

+0

的可能的複製http://stackoverflow.com/questions/1026635/setting-a-styles繼承-targettype-property-to-a-base-class –

+0

@AdiLester彈出對話框/窗口中的控件如何?有沒有辦法在不重複樣式的情況下對它們應用相同的外觀和感覺? – David

回答

2

您可以創建自定義類的隱式風格,從基類的風格

<Style TargetType="StackPanel"> 
    <Setter Property="Background" Value="#222222" /> 
</Style> 

<Style TargetType="{x:Type local:MyStackPanel}" 
     BasedOn="{StaticResource {x:Type StackPanel}}" /> 
+0

Thx。如何處理彈出對話框/窗口中的控件?有沒有辦法在不重複樣式的情況下對它們應用相同的外觀和感覺? – David

+1

@David如果將樣式放在Application.Resources中,它們應該應用於彈出對話框或其他窗口中的控件。否則,您可以將所有樣式放在資源文件中,只需在每個主要部分導入該文件,例如'Window.Resources' – Rachel

+0

是否可以在MyStackPanel中執行此操作? – David

0

重寫WPF控件不是一個好習慣。正如你所提到的,你需要爲此設計一個UserControl後代。

您可以將您的StackPanel(在您的UserControl中)的屬性綁定到您的UserControl後代的屬性,您可以將其添加到代碼或UserControl的內置屬性中。

<UserControl DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <StackPanel Background="{Binding Path=Background}"> 
    ... 
    </StackPanel> 
</UserControl> 
+0

但是,謝謝你,我不想這樣下去。原因是需要額外的工作,而且不靈活。例如,我將無法將控件添加到堆棧面板。 – David

+1

雖然這不適用於StackPanel示例:設計與本機主題不匹配的內置WPF主題也不是好習慣。微軟違反了Windows 8並認爲它很棒。所以我們必須在我們的應用程序中修復它。對於所有控件。 – ygoe