2013-11-21 45 views
6

我重写了wpf扩展器的模板。 头具有ContentPresenter为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> 

在哪里我试图加我的风格里面的所有的TextBlocks。 我的风格的作品,如果我设置页眉为属性:

<Expander Header="HelloWorld"> 

但事实并非如此,当我尝试将其设置在其他的方式。

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

如何为ContentPresenter中的任何TextBlocks设置此样式?

回答

10

你在wpf中遇到了典型的风格继承问题。

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

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

在第一个例子中,头文件正好存储“HelloWorld”,后来当控件处于初始化状态时,“HelloWorld”将被注入到ContentPresenter中。这种方法提供了“HelloWorld”,ContentPresenter是它的逻辑父项,因此样式可以被正确应用,因为可以找到样式。

在第二个示例中,您将创建一个Grid并在该Grid内部有一个TextBlock。

在控制初始化阶段,TextBlock的逻辑父项是Grid,而且Grid的逻辑父项是Expander本身。当为TextBlock寻找样式时,WPF会询问TextBlock的逻辑父项,如果它在TextBlock的资源中有适当的样式并且答案将是NO。 Grid.Resources中的TextBlock没有适当的样式,并且Expander.Resources中没有适当的TextBlock样式。

恰当的样式应该在ContentPresenter中,就在这种情况下,ContentPresenter不是逻辑树的一部分。

这就是你如何失去你的第二个例子的风格。

为了解决这个问题,我建议你坚持第一个例子或改变样式存储到的地方。通常所有样式都应该存储在Window.Resources中。

EDIT 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> 
+0

不好意思可能是我不明白,而是这是否意味着如果我使用: <样式的TargetType =“{X:类型Grid>}> user1706449

相关问题