【问题标题】:Control Template to modify background colour based on IsChecked控制模板根据 IsChecked 修改背景颜色
【发布时间】:2016-11-18 16:02:42
【问题描述】:

为了更改控件的视觉行为,有必要将整个 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 提供了一些示例,但没有提供有关该主题的任何明确参考。根据我在此处阅读的内容,我无法回答我的问题。

【问题讨论】:

    标签: wpf visual-studio-2013 controltemplate


    【解决方案1】:

    边框就像按钮周围的一个框。它具有控件的边框和背景属性。所以大多数控件的模板中都有边框,但是您可以根据需要模板化任何控件。您甚至可以使用椭圆来制作圆形按钮或将所有东西放入网格中。对于功能来说,重要的部分是 ContentPresenter。它定义了您设置的内容的显示位置。

    Microsoft 文档为您要使用的每个控件提供了很好的示例。它包含控件的每个命名部分以及它可以采用的每个 VisualState。

    例如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

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

    【讨论】:

    • 感谢您提醒我该链接,我已经看到了:我注意到完整示例的链接在德语中也已损坏。不幸的是,这并没有解释按钮的实际视觉结构,它只是给出了一个可能的自定义模板的例子(它没有声称使用每个命名的部分)。我已经猜到了您在回答中提出的观点,您能否提供对知识源的参考,或者您是否只是在使用反复试验来开发像我这样的假设?我将澄清我的问题,以参考未能解释我所追求的链接。
    • 我知道链接断开的问题。该网站被重新安排,这些完整的答案被归档。您看到的示例已经是详细的答案。我用另一个链接编辑了我的帖子。希望能帮助到你。对我来说,这就是我所知道的所有 Reference,因为它是我所使用的。
    • 好的,谢谢。我也知道该链接,已阅读但没有给出明确的参考。我猜MS(意外地)擅长保守秘密。我仍然可以应付得来,但最好消除它周围的雾气。
    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2011-11-22
    • 2016-06-02
    • 2019-06-20
    • 2013-10-24
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多