c# – WPF自定义控件构造,触发器和事件

前端之家收集整理的这篇文章主要介绍了c# – WPF自定义控件构造,触发器和事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
WPF自定义控件

我想建立一个新的自定义控件.我发现很少的教程给了我一些如何实现这一点的线索.据了解,创建新的自定义控件始终通过扩展当前的自定义控件来实现,甚至可以扩展
从层次结构的基本层次的控制,例如,你甚至可以扩展:

> 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天…感觉我在理解事情的工作方面缺少一些东西.没有找到任何深入解释这些问题的教程.

我想看看我在这里出现的每个问题的几行示例.

谢谢.

@H_403_49@解决方法
经过广泛的研究…

1)向外界公布事件
就好像你正在从任何其他类暴露出来.

public delegate void myDelegate(int someValue);  
public event myDelegate myEvent;

在你的代码的某个地方:

if(myEvent!=null)
  myEvent(5);

那部分没什么新鲜事

2)从后面的代码创建一个实例构造函数

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.

我真的希望这将有助于其他人在试图发展时获得“墙”自己的自定义控件.

猜你在找的C#相关文章