控制模板,用于根据IsChecked修改背景颜色

时间:2016-11-18 16:02:43

标签: wpf visual-studio-2013 controltemplate

为了改变控件的视觉行为,必须将整个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提供了一些示例,但未提供有关该主题的任何明确引用。根据我在这里读到的内容,我无法回答我的问题。

1 个答案:

答案 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

链接显示了如何构建模板,按钮示例以及如何设置按钮的可视状态。