<Style TargetType="{x:Type TextBlock}">
  ...
  ...
   <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBlock">  //TextBlock的模板
               ...
               ...
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style TargetType="{x:Type Button}">
  ...
  ...
   <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">  //Button的模板
                 ...
              ...
              <TextBlock>....</TextBlock> //模板中用到了TextBlock
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
上面有两个模板,一个TextBlock模板,一个是Button模板,在Button模板中用到了TextBlock控件。我想问的是:
1:Button模板中的TextBlock,到底是上面创建的TextBlock的样式呢,还是TextBlock的标准模板的样式?
2:如果要使用上面创建的TextBlock的样式该怎么做?如果要使用TextBlock的标准模板的样式该怎么做?

解决方案 »

  1.   


    <Style x:Key="bl" TargetType="{x:Type TextBlock}"><Style TargetType="{x:Type Button}">
       ...
       ...
        <Setter Property="Template">
             <Setter.Value>
                 <ControlTemplate TargetType="Button">  //Button的模板
                     ...
                   ...
                   <TextBlock Style="{DynamicResource bl}">....</TextBlock> //模板中用到了TextBlock
                 </ControlTemplate>
             </Setter.Value>
         </Setter>
     </Style>
      

  2.   

    这就好比如说你在方法x中定义了变量y,然后方法x之外也有全局作用域的变量y,你认为你看到的y是哪个y?
      

  3.   

    TextBlock的样式不是设置了TargetType="{x:Type TextBlock}"的吗,就算是不用x:key,Button模板中的TextBlock也应该是定义的TextBlock的样式吧
      

  4.   

    <Style TargetType="{x:Type TextBlock}">
    你这设置的是对所有的TextBlock应用这个样式,那么不管是不是在模板里,只要是TextBlock并且没有特别指定一个Style都会应用这个样式。
    如果想用默认的模板,就把这个Style加个Key,然后只在想应用这个Style上使用就好
      

  5.   

    那我的代码中,Button模板中的TextBlock就应该使用的是设置的TextBlock的模板吧?
      

  6.   

    那我的代码中,Button模板中的TextBlock就应该使用的是设置的TextBlock的模板吧?
    是的,其实这些你自己去测试下,1,2分钟的事情啊...
      

  7.   

    指定Style的,用特定样式,不指定Style的,用默认样式。通过TargetType将改变默认样式,但是会看你的TargetType出现的位置,WPF有继承性,如果两者无关系,则不受影响,如果TextBlock的样式指定出现在Button的上级,则受到影响。