wpf自定义控件中使用自定义事件
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;
}
|