我想建立一个新的自定义控件.我发现很少的教程给了我一些如何实现这一点的线索.据了解,创建新的自定义控件始终通过扩展当前的自定义控件来实现,甚至可以扩展
从层次结构的基本层次的控制,例如,你甚至可以扩展:
> UIElement
> FrameworkElement
>控制
> ContentControl
> HeaderedContentControl
> ItemsControl
>选择器
> RangeBase
如以下教程所写:http://wpftutorial.net/HowToCreateACustomControl.html
所以,我遵循了这个教程,并创建了一个新的自定义控件库项目,得到了我的通用.xaml和我的代码.到现在为止还挺好.
有3种类型的事件我可以区分.
>可以使用我的控件的窗口(或容器)消耗的事件:那些是我想要暴露给外部的事件.怎么写那些?
>与控制本身有关并且不在外部暴露的事件;
例如,如果鼠标在我的控制之下,我想反应
那个.我可以在XAML中做到这一点:
<ControlTemplate.Triggers> <Trigger Property="IsMouSEOver" Value="true"> <Setter Property="Fill" TargetName="LeftTraingularIndicator"> <Setter.Value> <SolidColorBrush Color="Yellow" /> </Setter.Value> </Setter> </Trigger> </ControlTemplate.Triggers>
假设couse我有一个元素与填充属性在我的
ControlTemplate命名为x:name =“LeftTraingularIndicator”
问题:
现在我想在我的XAML对IsMouseDown做出反应.我怎么做?
没有“IsMouseDown”触发器.此外,如果我想要的话
在代码背后做出反应?更进一步如果我想要的
要将LeftTraingularIndicator“Fill”从代码改成后面?
>与视觉的一部分的子元素相关的事件
我的ControlTemplate的构造,如果我想反应如何
到XAML中的“LeftTraigularIndicator”的“IsMouSEOver”还是甚至在Code Behind中?
也许甚至两者.
我现在试图呆了2天…感觉我在理解事情的工作方面缺少一些东西.没有找到任何深入解释这些问题的教程.
我想看看我在这里出现的每个问题的几行示例.
谢谢.
解决方法
1)向外界公布事件
就好像你正在从任何其他类暴露出来.
public delegate void myDelegate(int someValue); public event myDelegate myEvent;
在你的代码的某个地方:
if(myEvent!=null) myEvent(5);
那部分没什么新鲜事
public MyCustomControl() { MouseMove += MyCustomControl_MouseMove; } void MyCustomControl_MouseMove(object sender,MouseEventArgs e) { //now you can react to the movement of the mouse. //if for example I want to address an element,let's say a rectangle: var ele = (Rectangle)Template.FindName("myRect",this); ele.Fill=myNewBrush; // provided that we have an element named "myRect" (x:name="myRect") in // the generic.xaml style->Control Template-> which corresponds to that name. }
3)不推荐 – 因为它属于用户控件的范围而不是自定义控件.
自定义控件是“原子”,用户控件更适合于目的
组合控制.
但不是不可能
var myButton = (Button)Template.FindName("myButton",this); myButton.OnMouseMove += ....
请记住:
>代码隐藏中应该知道的任何东西都必须命名.
>你的xaml应该不知道代码背后的做法. (除了! – 继续阅读)
>代码隐藏中应该知道的部分必须具有正确的名称
你设计你的XAML.
我真的希望这将有助于其他人在试图发展时获得“墙”自己的自定义控件.