,它工作WPF控件模板打破風格
我需要的風格,是一個StackPanel的兒童某一類型的控制的東西。我正在使用:
<StackPanel>
<StackPanel.Resources>
<Style TargetType="{x:Type TextBlock}">...</Style>
</StackPanel.Resources>
<TextBlock ...>
...
</StackPanel>
而且這工作正常!每個TextBlock都會查看其父級(StackPanel)的資源,以瞭解應該如何設置樣式。無論您將TextBlock嵌套到StackPanel下方多遠,如果它沒有在其直接父級中找到樣式,它將查看其父級的父級等等,直到它找到某種東西(在這種情況下,在中定義的樣式)。
不起作用
我遇到了一個問題,當我嵌套在ContentControl中,其中有一個模板裏面TextBlock中的東西(見下面的代碼)。 ControlTemplate似乎破壞了TextBlock從其父母,祖父母等人獲取其風格的方式...
ControlTemplate的使用似乎有效地消除了TextBlock找到合適風格的方式(StackPanel中的風格)。參考資料)。當它遇到ControlTemplate時,它會停止在樹上的資源中查找它的樣式,而是默認使用應用程序本身的MergedDictionaries中的樣式。
<StackPanel Orientation="Vertical" Background="LightGray">
<StackPanel.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Green" />
</Style>
</StackPanel.Resources>
<TextBlock Text="plain and simple in stackpanel, green" />
<ContentControl>
<TextBlock Text="inside ContentControl, still green" />
</ContentControl>
<ContentControl>
<ContentControl.Template>
<ControlTemplate TargetType="{x:Type ContentControl}">
<StackPanel Orientation="Vertical">
<ContentPresenter />
<TextBlock Text="how come this one - placed in the template - is not green?" />
</StackPanel>
</ControlTemplate>
</ContentControl.Template>
<TextBlock Text="inside ContentControl with a template, this one is green as well" />
</ContentControl>
</StackPanel>
是否有辦法 - 除了在StackPanel.Resources複製樣式到ControlTemplate.Resources - 使該控件模板裏面TextBlock中找到定義的樣式?
謝謝...
很好的解釋基本樣式!我也喜歡你使用BasedOn =「{StaticResource {x:Type TextBlock}}」的方式。有趣。現在我知道WPF認爲ControlTemplates是一個邊界,我可以嘗試解決它:) –
謝謝,我終於明白如何將樣式應用於我的ControlTemplate。第三個例子是照亮,並允許我只將樣式應用到我需要的ControlTemplate(s)。 –