2014-05-19 45 views
0

我试图创建一个自定义控件,它继承自Button。在ControlTemplate中,我想将MyCustomButton显示为Circle,Square或其他任何形状。如何动态更改WPF中的ControlTemplate

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

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

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

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

回答

0

我重写ControlTemplate属性的元数据,并添加一个强制回调。然后,在Coerce阶段,返回当前想要使用的ControlTemplate(根据您的属性)。

在您ButtonShape属性值改变的回调,你需要调用CoerceValue()更新控件模板。

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

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

+0

对不起,你最终意味着什么重写ControlTemplate? – user3530012

+0

覆盖依赖项属性元数据,该元数据允许您添加否则不可用的回调。 http://msdn.microsoft.com/en-us/library/ms754209(v=vs.110).aspx –

1

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

+1

O/P的附加说明:如果使用Path([doc链接](http:// msdn .microsoft.com/en-us/library/system.windows.shapes.path.aspx)),您可以使用触发器将其Path.Data属性设置为不同的几何形状,如圆形,方形和更复杂的几何形状。 .. – elgonzo

+0

@elgonzo好想法。这样,他也避免了不必要的UI元素 –

+0

,这对我来说似乎是一个很好的方法,但如果有更多的形状呢?我的意思是,如果我想有十几个形状的按钮更改它的外观基于它们,它仍然是一个好方法? – user3530012