刚开始学WPF,
困惑1:
我现在想做这样一件事情,定义了3个usercontrol,分别为uc1,uc2,uc3,uc1在uc2中,uc2在uc3中。现在我定义了一个路由事件在uc1中,我想在uc3中处理。请问我怎么才能让他把事件抛的uc3中呢?
我现在的代码是这样的,
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));
}
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;
}
public UserControl3()
{
InitializeComponent();
AddHandler(UserControl1.Button1ClickEvent, new RoutedEventHandler(hand2));
}
public void hand2(object sender, RoutedEventArgs args)
{
MessageBox.Show("uc3");
}
困惑2:
发现路由事件的定义,使用和传统的事件区别不大。所以很困惑,路由事件的优点到底在哪里。到底有哪些事情是路由事件能做,而传统事件不能做的。最好给我举个例子,别用msdn上的理论,我实在头疼msdn,看了半天也没明白。
困惑3:
我想在上面那个代码的基础上,在uc3中定义一个Tannel的事件,然后在uc1中处理,怎么写呢?我现在的写法是在uc3中定义Tannel事件,然后在uc2和uc1中加
AddHandler(UserContro3.Button1ClickEvent, new RoutedEventHandler(method));
但是在uc2中根本接受不到uc3中raise的事件。请问是怎么回事呢。
非常诚心的请求大家的帮助。谢谢啦!专家分如果不够,还可以再加。
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进行了取代,你也可以使用它来完成你的操作。
问题对于不熟悉WPF的人来说,就是很难。
楼上WPF高人。
1.定义了一个路由事件在uc1中,想在uc3中处理。只需在uc1发送,在uc3中AddHandler就可以了吧!
2.我想请问一下,"在uc3中定义一个Tannel的事件,然后在uc1中处理"这个楼主做到了吗?按我现在对路由事件的理解,是不能这样实现的,但不太确定。