Wpf 设置ContentPresenter中所有元素的样式
我重写了wpf扩展器的模板。 标题包含ContentPresenterWpf 设置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"
<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>
对不起,我可能不明白,但这是否意味着如果我使用:`它应该有效?是的,我希望我们讨论的是相同的:)是的,它应该有效。是的,它应该有效!但通常情况下并非如此。我将为您创建一个示例,并在我的答案中跳过代码。给我几分钟,看一下。你在之前的评论中又用错了。