首页 新闻 会员 周边

高分求解:WPF路由事件的困惑

0
悬赏园豆:30 [已解决问题] 解决于 2010-07-19 15:15

刚开始学WPF,

困惑1:

我现在想做这样一件事情,定义了3个usercontrol,分别为uc1,uc2,uc3,uc1在uc2中,uc2在uc3中。现在我定义了一个路由事件在uc1中,我想在uc3中处理。请问我怎么才能让他把事件抛的uc3中呢?

我现在的代码是这样的,

uc1:

UC1


public static readonly RoutedEvent Button1ClickEvent = EventManager.RegisterRoutedEvent("Button1Click", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(UserControl1));

public event RoutedEventHandler Button1Click
{
add { AddHandler(Button1ClickEvent, value); }
remove { RemoveHandler(Button1ClickEvent, value); }
}

private void button1_Click(object sender, RoutedEventArgs e)
{
RaiseEvent(
new RoutedEventArgs(Button1ClickEvent));
}
UC2:

代码


public UserControl2()
{
InitializeComponent();
AddHandler(UserControl1.Button1ClickEvent,
new RoutedEventHandler(hand));
//this.uc1.Button1Click += new RoutedEventHandler(hand);
}

public void hand(object sender,RoutedEventArgs args)
{
RaiseEvent(
new RoutedEventArgs(UserControl1.Button1ClickEvent,this));
//args.Handled = true;
}
UC3:

代码

public UserControl3()
{
InitializeComponent();
AddHandler(UserControl1.Button1ClickEvent,
new RoutedEventHandler(hand2));
}

public void hand2(object sender, RoutedEventArgs args)
{
MessageBox.Show(
"uc3");
}
但是这么写后,发现在uc2事件处理方法中就死循环了。我想我可能是对路由方法的原理还是不清楚,所以才有这样的低级错误。高手来帮忙呀,肯定是举手之劳!

困惑2:

发现路由事件的定义,使用和传统的事件区别不大。所以很困惑,路由事件的优点到底在哪里。到底有哪些事情是路由事件能做,而传统事件不能做的。最好给我举个例子,别用msdn上的理论,我实在头疼msdn,看了半天也没明白。

困惑3:

我想在上面那个代码的基础上,在uc3中定义一个Tannel的事件,然后在uc1中处理,怎么写呢?我现在的写法是在uc3中定义Tannel事件,然后在uc2和uc1中加

AddHandler(UserContro3.Button1ClickEvent, new RoutedEventHandler(method));

但是在uc2中根本接受不到uc3中raise的事件。请问是怎么回事呢。

非常诚心的请求大家的帮助。谢谢啦!专家分如果不够,还可以再加。

问题补充: 自己顶一下,我肯定是对路由事件的理解哪卡住了,虽然比较小白,但请大家不吝赐教。 怎么没人回答呢? 难道我这个问题是个很难的问题吗? 我再加分,就不信没人知道。
Eddie Chen的主页 Eddie Chen | 初学一级 | 园豆:150
提问于:2010-07-13 22:06
< >
分享
最佳答案
0

Hi, Eddie

   你这种方式是可以实现的,但这样做容易引起混乱,我们首先要弄清楚路由事件的本质,其实它和普通的事件原理是一样的,只不过它有三种路由方式而已。所以你应该知道几个概念:1,事件源(这个事件的位置以及是怎么声明的)  2,事件的订阅者(谁订阅了这个事件)  3,事件的触发机制(是手动触发还是通过键盘、鼠标等外部触发)。

你这里最好把这个事件定义在一个公共的内库中,这样只要通过如下方式:

 this.btnRaiseEvent.Click += new RoutedEventHandler(btnRaiseEvent_Click);或者

            this.AddHandler(UserControlThatCreatesEvent.CustomClickEvent, new RoutedEventHandler(ucCustomEvent_CustomClick));

进行订阅,然后用

       RoutedEventArgs args = new RoutedEventArgs(CustomClickEvent);
            RaiseEvent(args);或者

绑定到一个按钮等上,又外界触发。具体我想你应该知道怎么做了吧,如果有不清楚的地方或者有没有实现的功能我们再讨论,最后由于我们现在使用了MVVM模式,所以事件的功能都被command进行了取代,你也可以使用它来完成你的操作。

收获园豆:30
圣殿骑士 | 菜鸟二级 |园豆:255 | 2010-07-15 09:16
其他回答(2)
0

问题对于不熟悉WPF的人来说,就是很难。

楼上WPF高人。

Astar | 园豆:40805 (高人七级) | 2010-07-15 09:30
我又试了一下,用EventManager.RegisterClassHandler代替AddHandler是好用的,用AddHandler在第二层的时候总是死循环。不知道为什么。
支持(0) 反对(0) Eddie Chen | 园豆:150 (初学一级) | 2010-08-05 23:02
0

1.定义了一个路由事件在uc1中,想在uc3中处理。只需在uc1发送,在uc3中AddHandler就可以了吧!

2.我想请问一下,"在uc3中定义一个Tannel的事件,然后在uc1中处理"这个楼主做到了吗?按我现在对路由事件的理解,是不能这样实现的,但不太确定。

tayoru | 园豆:207 (菜鸟二级) | 2010-11-24 22:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册