4

我有以下 XAML(简化):

<Window ...

    <Window.Resources>
        <Style TargetType="{x:Type TextBlock}" >
            <Setter Property="FontSize" Value="28" />
            <Setter Property="Margin" Value="3" />
            <Setter Property="Foreground" Value="Green" />
        </Style>
    </Window.Resources>

    <StackPanel>

        <ListBox ItemsSource=...
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" >
                        <TextBlock Text="{Binding Index}" />
                        <TextBlock Text="-" />
                        <TextBlock Text="{Binding Hours, StringFormat={}{0:00}}" />
                        <TextBlock Text=":" />
                        <TextBlock Text="{Binding Minutes, StringFormat={}{0:00}}" />
                        <TextBlock Text=":" />
                        <TextBlock Text="{Binding Seconds, StringFormat={}{0:00}}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        ...

使用此代码,Window.Resources 中定义的样式不会应用于 DataTemplate 内的 TextBlock,而是应用于 Window 上的其他 TextBlock。

如果我复制样式并将其设置在 DataTemplate 资源中,如下所示:

        <DataTemplate.Resources>
            <Style TargetType="{x:Type TextBlock}" >
                <Setter Property="FontSize" Value="28" />
                <Setter Property="Margin" Value="3" />
                <Setter Property="Foreground" Value="Green" />
            </Style>
        </DataTemplate.Resources>

然后它工作。知道为什么我需要复制样式吗?

提前致谢。

4

3 回答 3

4

隐式Styles仅适用于从模板继承的类型,System.Windows.Controls.Control因为TextBlock直接从System.Windows.FrameworkElement它继承将不起作用。您必须给出您的样式x:Key并明确使用它或声明您的样式,Application.Resources但随后它将适用于所有人TextBlocks,我的意思是基本上每个显示的文本位,在整个应用程序中

于 2013-10-03T08:36:51.473 回答
3

这是一个 WPF 怪癖。当控件不是从 继承Control,而是直接从继承时,FrameworkElement模板内的隐式样式查找会直接跳到应用程序资源。如果您将样式放在应用程序资源 ( App.xaml) 中,它将起作用。

或者,您可以使用命名资源并BasedOn引用它:

    <DataTemplate.Resources>
        <Style TargetType="TextBlock" BasedOn="{StaticResource MyTextStyle}" />
    </DataTemplate.Resources>
于 2013-10-03T08:36:33.570 回答
2

请看一下DataTemplate 和 Style Confusion

我于 2006 年 10 月在 Connect 上将此作为“错误”发布。

...

“这种行为是‘设计使然’,这就是原因。模板被视为封装边界。由这些模板生成的元素落在此边界内。查找具有匹配 TargetType 的样式在此边界处停止。因此,TextBlock 中的通过模板生成的 repro 不会选择有问题的样式,而在模板外部定义的 TextBlock 会。

解决此问题的一种方法是为样式指定一个显式名称,并通过该名称在模板内的 TextBlock 上引用该样式。

于 2013-10-03T08:42:40.340 回答