出现 XXX_Click_1 的原因:
在设计器上点击按钮自动生成了 XXX_Click 函数,因某个操作 (删除控件后再次添加) 导致 XAML 中 Click="XXX_Click" 代码丢失,然后再次点击按钮而自动生成的。
解决办法很简单,在 XAML 代码编辑器中找到 XXX 然后将 Click="XXX_Click_1" 改成 "XXX_Click" 就可以了。也就是说,可以先定义事件处理函数,然后再为一个或多个控件指定。
RoutedEventArgs 和 EventArgs 不能随意替换。
Route 的意思就是路由,在 WPF 中引入了事件路由这一概念,举个例子比较好理解一点:
窗口中有一系列的控件 Grid\StackPanel\Button 等,
在 WinForm 中:当 Button 的 MouseMove 事件被触发时,其父级控件 (StackPanel、Grid、Form) 是不会触发 MouseMove 事件的。
WPF 中:会因路由概念的引入,导致 Button 的所有父级控件触发 MouseMove 事件,当然,前提是在代码中指定了事件函数。
所以,我们需要 RoutedEventArgs 这个参数,从 e.Source、e.OriginalSource 来确定该事件是由哪个子控件触发的。由于 WPF 控件是由 ControlTemplate 定义的,所以,单个控件也会需要事件路由来确定,该控件的模板中哪个元素引发了事件,从而精确处理控件事件。
1为了区分啊要是两个都是XXX_Click,鬼知道你点了哪个按钮
11,这问的傻了,两者是不同的编程,怎么替换啊
Well, basically a RoutedEvent travels through the Logical tree, either from top to bottom (Bubble event route) or bottom to top (Tunnel event route). What this means is that if you have a Button inside of a StackPanel, that itself is inside of a Grid; if you define a Click event in the controls they will all trigger it unless one of them handles it.
If the event route is Bubble (named as a regular event Click), it will go:
Button -> StackPanel -> Grid
If the event route is Tunnel (named PreviewClick), it will go the other way around:
Grid -> StackPanel -> Button
So now with the handling, it's pretty simple. If it's a Bubble route and the Button sets the RoutedEventArgs.Handled to true, that StackPanel and Grid will not trigger it. Same with the RoutedEvent, if the Grid handles it, the StackPanel and Button will not trigger it.
This is my understanding in a nutshell, I avoided some stuff for simplicity.
I recommend this chapter for better understanding of this WPF feature.
我来回答你的这个问题 呵呵
对于第一个 生成的btnA_Click,btnB_Click_1是VS自动生成的事件处理函数名称,至于为什么名字为什么是这样完全是VS来确定 你无需理解这个
反而第二个问题 RoutedEventArgs和EventArgs 这个得从WPF和Winform的事件处理机制说起了, WPF采用的路由事件处理系统(而Routed就是这个意思) WPF里的一共有三种类型的事件(但一般都是路由事件 ) 理由事件又分为隧道式和冒泡式 隧道式:假如我定义了一个StackPanel StackPanel里又放置了一个Button 当我定义 StackPanel 的单击事件的时候 事件会从StackPanel传递到Button 而冒泡式则相反
如果还想了解的更详细可以Hi我