【问题标题】:How to dynamically change a ControlTemplate in WPF如何在 WPF 中动态更改 ControlTemplate
【发布时间】:2014-05-20 06:32:06
【问题描述】:

我正在尝试创建一个继承自 Button 的自定义控件。在 ControlTemplate 中,我想将 MyCustomButton 显示为圆形、方形或其他任何形状。

我有一个 DependencyProperty - ButtonShape - 它是一种枚举类型,指示按钮形状的类型。当用户更改 ButtonShape 时,必须更改按钮的外观。

我知道如何为我的自定义按钮创建一个 ControlTemplate,使其看起来像圆形、方形或椭圆形或任何其他形状,但我不知道如何处理更改部分。

也许我应该创建其他 ControlTemplates 并在 OnButtenShapeChanged 事件中设置适当的模板,但我认为这不是正确的方法。

任何想法将不胜感激。谢谢。

【问题讨论】:

    标签: c# wpf controltemplate


    【解决方案1】:

    我相信最简单的方法是define triggers in your ControlTemplate。 您需要在(单个)ControlTemplate 中定义三个形状,并根据ButtonShape 属性的状态显示/隐藏所需的形状。

    【讨论】:

    • 对 O/P 的附加说明:如果您使用 Path (doc link) 作为形状,您可以使用触发器将其 Path.Data 属性设置为不同的几何形状,例如圆形、方形等复杂的...
    • @elgonzo 好主意。这样他也避免了不必要的 UI 元素
    • 这在我看来是个好方法,但是如果有更多的形状呢?我的意思是,如果我想要十几个形状,按钮会根据它们改变它的外观,这仍然是一个好方法吗?
    • @elgonzo 这就是你的想法。听起来更好
    【解决方案2】:

    我会覆盖 ControlTemplate 属性元数据并添加强制回调。然后,在强制阶段,返回您要使用的当前 ControlTemplate(基于您的属性)。

    在您的 ButtonShape 属性值更改回调中,您需要调用 CoerceValue() 来更新 ControlTemplate。

    这将禁用消费者设置自己的控制模板的能力,但听起来这在这里可能不是问题。

    这里有一些关于依赖属性强制的基础知识:http://msdn.microsoft.com/en-us/library/ms745795(v=vs.110).aspx#Coerce_Value_Callbacks_and_Property_Changed_Events

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多