WPF路由事件

与传统的winform不同,WPF的事件的发送者与事件的响应着并没有直接的关系,当然而这也可以是同一个对象。

事件仅仅是沿着逻辑树一直向上转发,如果有对象对事件进行响应,则会出发相应的动作。

举例来说。

新建一个窗口

    <Grid Background="#FFB6B600" MouseUp="Grid_MouseUp_1" Name="g1">
        <Grid Margin="20" Background="Red" MouseUp="Grid_MouseUp_1" Name="g2">
            <Grid  Margin="20" Background="#FF074AD8" MouseUp="Grid_MouseUp_1" Name="g3">
                <Button x:Name="btn1" Content="Button" HorizontalAlignment="Left" Margin="182,103,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>


            </Grid>
        </Grid>
    </Grid>

我们先不管中间的button,可以看到每一个grid都实现了Grid_MouseUp_1方法

        private void Grid_MouseUp_1(object sender, MouseButtonEventArgs e)
        {
            Grid g = sender as Grid;
            MessageBox.Show(g.Name);
            
        }

这个时候,你单击其中一个gird,会发现每一个gird都会响应这个单击,因为每一个事件处理完成该事件以后,就会继续转发该事件,所以事件会沿着视图树传播到每一个grid对象中。视图树可以在文档大纲中看到。

 

刚才我们说了,事件的发送者和响应着是没有任何直接关系的。那么也就是说响应button的click事件的不一定是button 可以是任何对象。

我们添加如下代码

        public MainWindow()
        {
            InitializeComponent();
            g1.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click_1));
        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            FrameworkElement f = sender as FrameworkElement;
            MessageBox.Show(f.Name);
        }

点击按钮以后,会将事件的的响应对象的名字打印出来。

这个时候会看到两个messagebox,一个提示btn1,就是按钮本身的响应,另外一个是g1就是grid的响应。

每一个对象都有一个eventhandler,需要响应那个事件,仅仅需要将对应的事件添加进去就可以了。

如g1添加对按钮点击事件的响应。

g1.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click_1));

 

转载于:https://www.cnblogs.com/HighFun/archive/2013/03/10/2952822.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF中,自定义事件可以通过以下步骤实现: 1. 定义一个自定义事件: ``` public class MyRoutedEvent : RoutedEventArgs { public MyRoutedEvent() : base() { } public MyRoutedEvent(RoutedEvent routedEvent) : base(routedEvent) { } public MyRoutedEvent(RoutedEvent routedEvent, object source) : base(routedEvent, source) { } public string MyEventArgs { get; set; } // 自定义事件参数 public static readonly RoutedEvent MyEvent = EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyRoutedEvent)); // 添加事件处理程序 public event RoutedEventHandler MyEventHandler { add { AddHandler(MyEvent, value); } remove { RemoveHandler(MyEvent, value); } } // 触发事件 public void RaiseMyEvent() { RaiseEvent(new RoutedEventArgs(MyEvent)); } } ``` 在这个例子中,我们定义了一个继承自RoutedEventArgs的类,并添加了一个自定义事件参数MyEventArgs。我们还定义了一个静态只读的MyEvent事件,并为它添加了一个事件处理程序MyEventHandler。最后,我们实现了一个RaiseMyEvent方法,该方法将触发MyEvent事件。 2. 在UI元素中使用自定义事件: ``` <Button Content="Click me" Click="Button_Click"/> ``` 在这个例子中,我们将按钮的Click事件绑定到Button_Click方法。在该方法中,我们可以创建一个MyRoutedEvent实例并触发它: ``` private void Button_Click(object sender, RoutedEventArgs e) { MyRoutedEvent myEvent = new MyRoutedEvent(); myEvent.MyEventArgs = "Hello World!"; RaiseEvent(myEvent); } ``` 在这个例子中,我们创建了一个MyRoutedEvent实例,并将MyEventArgs设置为“Hello World!”。然后,我们调用RaiseEvent方法触发MyEvent事件。 3. 在父控件中处理自定义事件: ``` <Grid local:MyRoutedEvent.MyEvent="Grid_MyEvent"> <!-- 子控件 --> </Grid> ``` 在这个例子中,我们将Grid控件的MyEvent事件绑定到Grid_MyEvent方法。在该方法中,我们可以获取到MyEventArgs的值: ``` private void Grid_MyEvent(object sender, RoutedEventArgs e) { MyRoutedEvent myEvent = (MyRoutedEvent)e; string myEventArgs = myEvent.MyEventArgs; // 处理自定义事件 } ``` 在这个例子中,我们获取MyRoutedEvent实例,并将其转换为MyRoutedEvent类型。然后,我们可以获取MyEventArgs的值并进行处理。 这就是一个简单的自定义事件的实现方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值