1 创建自定义控件及自定义事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
/// <summary> /// 演示用的自定义控件 /// </summary> public class ExtButton : Button { public ExtButton() { base .Click += ExtButton_Click; } private void ExtButton_Click( object sender, RoutedEventArgs e) { //定义传递参数 // RoutedPropertyChangedEventArgs<Object> args = new RoutedPropertyChangedEventArgs<Object>("1", "2", ControlLoadOverEvent); RoutedEventArgs args2 = new RoutedEventArgs(ControlLoadOverEvent, this ); //引用自定义路由事件 this .RaiseEvent(args2); } /// <summary> /// 声明路由事件 /// 参数:要注册的路由事件名称,路由事件的路由策略,事件处理程序的委托类型(可自定义),路由事件的所有者类类型 /// </summary> public static readonly RoutedEvent ControlLoadOverEvent = EventManager.RegisterRoutedEvent( "ControlLoadOverEvent" , RoutingStrategy.Bubble, typeof (RoutedPropertyChangedEventArgs<Object>), typeof (ExtButton)); /// <summary> /// 处理各种路由事件的方法 /// </summary> public event RoutedEventHandler ControlLoadOver { //将路由事件添加路由事件处理程序 add { AddHandler(ControlLoadOverEvent, value); } //从路由事件处理程序中移除路由事件 remove { RemoveHandler(ControlLoadOverEvent, value); } } } |
2 使用并绑定自定义控件的事件
1
2
3
4
5
6
7
8
|
<!--i为System.Windows.Interactivity引用--> <ext:ExtButton x:Name= "extButton" Content= "绑定自定义事件" HorizontalAlignment= "Left" Margin= "123,10,0,0" VerticalAlignment= "Top" Width= "95" > <i:Interaction.Triggers> <i:EventTrigger EventName= "ControlLoadOver" > <i:InvokeCommandAction Command= "{Binding ButtonLoadOverCommand}" CommandParameter= "{Binding ElementName=extButton}" ></i:InvokeCommandAction> </i:EventTrigger> </i:Interaction.Triggers> </ext:ExtButton> |
3 触发自定义事件后的操作
方式1
1
2
3
4
5
6
7
8
9
10
|
public DelegateCommand<Object> ButtonLoadOverCommand { get ; set ; } public void ButtonLoadOver(Object obj) { //这里的参数为自定义控件对象 ExtButton btn = obj as ExtButton; if (btn != null ) { var content = btn.Content; } } |
方式2
1
2
3
4
5
6
7
|
this .extButton.ControlLoadOver += ExtButton_ControlLoadOver; private void ExtButton_ControlLoadOver( object sender, RoutedEventArgs e) { var btn = (Button)e.Source; var str = btn.Content; }
|