wpf自定义控件中使用自定义事件

时间:2022-03-23 08:29:26

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 { getset; }
        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;
        }