查看控件样式具体属性

在VirtualStudio中,我们可以通过文档大纲找到具体元素控件,右键选择“编辑模板--编辑副本”可以查看该控件当前的样式具体属性设置,再未对控件自定义样式的时候通过这种方法查看到的即为系统为该控件预设的样式属性

由此再注释几个属性:

ContentPresenter  定义控件呈现的内容(究其根本是所有的空间都是通过继承ContentControl类来通过其中的ContentPresenter来设置各自的Content,Content的数据类型是Object类型)

因为Content数据类型的缘故,允许我们设置比较复杂的Content样式,除了通过前面提到的<Button Content="Button1"/>这种形式设置简单Content外,可以通过下列嵌套方式进行复杂Content设置:

<Button>
  <Button.Content>
    <StackPanel Orientation="Horizontal"> <!-- 这里设置所有的Content内容按水平方向排列 -->
      <Button Content="Button1"/>
      <Button Content="Button2"/>
      <Button Content="Button3"/>
      <TextBlock Text="TextBlock1">
    </StackPanel>
  </Button.Content>
</Button>

相比较前面的简单设置,这里的ButtonContent不仅包含了三个子Button内容还有一个TextBlock内容,这一效果的成功呈现归功于ContentPresenter

如果将ContentPresenter部分移除,则无法通过上面的StackPanel嵌套结构设置复杂形式的Content,

但这也不代表就完全设置不了Content了,如果只是一个简单的文本信息Content,可以先在原本ContentPresenter的位置通过<TextBlock Text="{TemplateBinding Button.Content}"/>将TextBlock和后面的Button的Content属性内容进行绑定,然后再去后面设置<Button Content="Button1"/>即可重新呈现这种比较简单的ButtonContent,这种简单Content在ContentPresenter缺失的情况下能通过TextBlock进行替代的原因是虽然没有了ContentPresenter提供的对Object类型的呈现,但此时的Content仍支持对String这种基本数据类型的呈现

由此我们也了解了TemplateBinding的功能,我们是通过这个方法将样板中的样式名和控件的样式属性进行绑定,如果没有在样板中声明绑定关系,则后面控件对应的样式属性也无法正常呈现

同时,被绑定的样式属性显然应该是当前空间已有的属性(没有的属性谈何绑定)

运行窗口程序后,在VS提供的实时可视化树中我们可以更为清晰的了解当前窗口的层次结构(实时可视化树所属工具栏在“调试--选项--调试--热重载--WPF和UMP--启用应用内工具栏”可以设置是否启用)

归根到底ControlTemplate直接控制的是一个控件模板,除了像上面那样在Border中设置样板属性外,同样可以在ControlTemplate内部添加Grid嵌套进行对该模板进行一个布局设置(多多尝试不同标签之间的搭配能更深入准确地了解WPF)

<ControlTemplate TargetType="x:Type Button">
  <Grid>  <!-- 这里通过添加一个Grid将原本的模板样式由默认的单行布局改为两行布局 -->
    <Grid.RowDefinitions>
      <RowDefinition/>
      <RowDefinition/>
    </Grid.RowDefinitions>
  </Grid>
  <Border>
    <ContentPresenter>
    </ContentPresenter>
  </Border>
</ControlTemplate>