VS菜鸟请教WPF编程中按钮事件的问题:Click和Click_1
我是WPF菜鸟,现在正用VS2010编程,遇到了这样的一个问题:在MainWindow里面我拖出来了几个按钮控件,后来发现双击他们,有的事件是XXX_Click,有的是X...
我是WPF菜鸟,现在正用VS2010编程,遇到了这样的一个问题:
在MainWindow里面我拖出来了几个按钮控件,后来发现双击他们,有的事件是
XXX_Click,有的是XXX_Click_ 1,为什么会出现这种情况?
另外,在WPF编程的时候,按钮事件里面是object sender, RoutedEventArgs e
而在Form里面则是object sender, EventArgs e。两者有什么区别?可以替代么?
求高手解决!
不是不是,比如说我两个按钮,一个叫btnA,一个叫btnB
我双击btnA,他让我写的是private void btnA_Click
双击btnB,结果自动跳到private void btnB_Click_1
他那个序号是自动给的么?对此理解不了
关于RoutedEventArgs e和EventArgs e,我想从原理上了解一下两者的区别 展开
在MainWindow里面我拖出来了几个按钮控件,后来发现双击他们,有的事件是
XXX_Click,有的是XXX_Click_ 1,为什么会出现这种情况?
另外,在WPF编程的时候,按钮事件里面是object sender, RoutedEventArgs e
而在Form里面则是object sender, EventArgs e。两者有什么区别?可以替代么?
求高手解决!
不是不是,比如说我两个按钮,一个叫btnA,一个叫btnB
我双击btnA,他让我写的是private void btnA_Click
双击btnB,结果自动跳到private void btnB_Click_1
他那个序号是自动给的么?对此理解不了
关于RoutedEventArgs e和EventArgs e,我想从原理上了解一下两者的区别 展开
3个回答
展开全部
出现 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 定义的,所以,单个控件也会需要事件路由来确定,该控件的模板中哪个元素引发了事件,从而精确处理控件事件。
在设计器上点击按钮自动生成了 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.
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我
对于第一个 生成的btnA_Click,btnB_Click_1是VS自动生成的事件处理函数名称,至于为什么名字为什么是这样完全是VS来确定 你无需理解这个
反而第二个问题 RoutedEventArgs和EventArgs 这个得从WPF和Winform的事件处理机制说起了, WPF采用的路由事件处理系统(而Routed就是这个意思) WPF里的一共有三种类型的事件(但一般都是路由事件 ) 理由事件又分为隧道式和冒泡式 隧道式:假如我定义了一个StackPanel StackPanel里又放置了一个Button 当我定义 StackPanel 的单击事件的时候 事件会从StackPanel传递到Button 而冒泡式则相反
如果还想了解的更详细可以Hi我
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询