Wpf 设置ContentPresenter中所有元素的样式

Wpf 设置ContentPresenter中所有元素的样式,wpf,silverlight,wpf-controls,Wpf,Silverlight,Wpf Controls,我重写了wpf扩展器的模板。 标题包含ContentPresenter <ContentPresenter x:Name="HeaderContent" Grid.Column="1" Margin="0,0,4,0" HorizontalAlignment="Left" VerticalAlignment="Center"

我重写了wpf扩展器的模板。 标题包含ContentPresenter

<ContentPresenter x:Name="HeaderContent"
                  Grid.Column="1"
                  Margin="0,0,4,0"
                  HorizontalAlignment="Left"
                  VerticalAlignment="Center"
                  RecognizesAccessKey="True"
                  SnapsToDevicePixels="True"
                  >
    <ContentPresenter.Resources>
        <Style BasedOn="{StaticResource Expanderheader-Naming}" 
               TargetType="{x:Type TextBlock}" />
     </ContentPresenter.Resources>
</ContentPresenter>

我试图为里面的所有文本块添加我的样式。 如果我将标题设置为属性,则我的样式有效:

<Expander Header="HelloWorld">

但当我试着用另一种方式设置它时,它就不起作用了

<Expander>
    <Expander.Header>
        <Grid x:Name="MyGrid">
            <TextBlock>Hello Man</TextBlock>
        </Grid>  
    </Expander.Header>
</Expander>

你好,伙计

如何为ContentPresenter中的任何文本块设置此样式?

您在wpf中遇到了典型的样式继承问题

控件在初始化时查找其样式。控件查找样式的方法是在逻辑树中向上移动,并询问逻辑父级是否在父级的资源字典中存储了适合它们的样式

为了向你解释你在例子中做错了什么,让我们这样想

在第一个示例中,标题只是存储“HelloWorld”,稍后在初始化控件时,“HelloWorld”将被注入ContentPresenter。这种方法提供了“HelloWorld”,ContentPresenter是其逻辑父级,因此可以正确应用样式,因为可以找到样式

在第二个示例中,您创建了一个网格,在该网格内有一个TextBlock

在控制初始化时,文本块的逻辑父级是网格,而且网格的逻辑父级是扩展器本身。在查找TextBlock的样式时,WPF将询问TextBlock的逻辑父级,其资源中是否有适合TextBlock的样式,答案为否。Grid.resources中没有适合TextBlock的样式,Expander.resources中也没有适合TextBlock的样式

正确的样式应该在ContentPresenter内部,只是在这种情况下ContentPresenter不是逻辑树的一部分

这就是您在第二个示例中丢失样式的原因

为了解决这个问题,我建议您坚持使用第一个示例,或者更改样式的存储位置。通常所有样式都应存储在Window.Resources中

编辑2 仔细看看这个例子:

<Window.Resources>
    <Style x:Key="textBlockStyle" TargetType="TextBlock">
        <Setter Property="Background" Value="Blue"/>
    </Style>


    <Style TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <ContentPresenter>
                        <ContentPresenter.Resources>
                            <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle}"/>
                        </ContentPresenter.Resources>
                    </ContentPresenter>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<StackPanel>
    <Button Content="Yay, it worked!" />
    <Button>
        <Grid>
            <TextBox Text="It doesn't work this way!"/>
        </Grid>
    </Button>
    <Button>
        <Grid>
            <Grid.Resources>
                <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle}"></Style>
            </Grid.Resources>
            <TextBlock Text="Yay it works again! Woop Woop"/>
        </Grid>
    </Button>
</StackPanel>


对不起,我可能不明白,但这是否意味着如果我使用:`它应该有效?是的,我希望我们讨论的是相同的:)是的,它应该有效。是的,它应该有效!但通常情况下并非如此。我将为您创建一个示例,并在我的答案中跳过代码。给我几分钟,看一下。你在之前的评论中又用错了。