为了改变控件的视觉行为,必须将整个ControlTemplate提取到xaml中并修改相应的部分。这不是问题(从控件的属性视图中,单击Template属性右侧的小方块,然后选择Convert to New Resource),然后编辑为...
<ControlTemplate x:Key="ToggleButtonControlTemplate1" TargetType="{x:Type ToggleButton}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ContentPresenter x:Name="contentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}" RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsDefaulted" Value="True">
<Setter Property="BorderBrush" TargetName="border"
Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" TargetName="border" Value="#FFBEE6FD"/>
<Setter Property="BorderBrush" TargetName="border" Value="#FF3C7FB1"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" TargetName="border" Value="#FFC4E5F6"/>
<Setter Property="BorderBrush" TargetName="border" Value="#FF2C628B"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" TargetName="border" Value="#FFBCDDEE"/>
<Setter Property="BorderBrush" TargetName="border" Value="#FF245A83"/>
<Setter Property="Background" TargetName="border" Value="Red"/> <!-- mod -->
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" TargetName="border" Value="#FFF4F4F4"/>
<Setter Property="BorderBrush" TargetName="border" Value="#FFADB2B5"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#FF838383"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
我可以看到在这种情况下Border元素已被用作根节点,并且ContentPresenter位于Border Content属性中, 但是,使用Border元素作为视觉根的原理是什么,为什么通过设置Border的BackGround属性来管理按钮的背景颜色?
此外,哪些元素可用作根节点以及哪些是继承规则?标准控件的可视化结构是什么?我在哪里可以找到一些合理的文档?
我对VisualTreeRootNode有一些模糊的理解,并且需要一个模板的单个根节点,但......只是含糊不清。
有一些背景here,但没有明确的参考 基本概念记录在here,您可以深入查看各个控件以查找示例。 link to Visual Tree看起来很有希望,但它已经破碎了。 button section提供了一些示例,但未提供有关该主题的任何明确引用。根据我在这里读到的内容,我无法回答我的问题。
答案 0 :(得分:0)
边框就像按钮周围的方框。它具有控件的Border和Background属性。因此大多数控件在其模板中都有边框,但您可以根据需要对任何控件进行模板设置。您甚至可以使用椭圆来制作圆形按钮或将所有内容放入网格中。对于功能,重要的部分是ContentPresenter。它定义了您设置的内容的显示位置。
Microsoft文档为您要使用的每个控件提供了很好的示例。它包含Control的每个命名部分以及它可以采用的每个VisualState。
e.g。按钮的https://msdn.microsoft.com/de-de/library/ms753328(v=vs.110).aspx
要详细解答模板在WPF中的工作原理,请参阅:
https://msdn.microsoft.com/en-us/en-en/library/ee230084(v=vs.110).aspx
链接显示了如何构建模板,按钮示例以及如何设置按钮的可视状态。