VS菜鸟请教WPF编程中按钮事件的问题:Click和Click_1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS菜鸟请教WPF编程中按钮事件的问题:Click和Click_1相关的知识,希望对你有一定的参考价值。

我是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,我想从原理上了解一下两者的区别

出现 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 定义的,所以,单个控件也会需要事件路由来确定,该控件的模板中哪个元素引发了事件,从而精确处理控件事件。
参考技术A 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.追问

额..我搜到过这段英文..有通俗点的解释么...
而且并没有看出来两者是不能替换的...

参考技术B 我来回答你的这个问题 呵呵

对于第一个 生成的btnA_Click,btnB_Click_1是VS自动生成的事件处理函数名称,至于为什么名字为什么是这样完全是VS来确定 你无需理解这个

反而第二个问题 RoutedEventArgs和EventArgs 这个得从WPF和Winform的事件处理机制说起了, WPF采用的路由事件处理系统(而Routed就是这个意思) WPF里的一共有三种类型的事件(但一般都是路由事件 ) 理由事件又分为隧道式和冒泡式 隧道式:假如我定义了一个StackPanel StackPanel里又放置了一个Button 当我定义 StackPanel 的单击事件的时候 事件会从StackPanel传递到Button 而冒泡式则相反

如果还想了解的更详细可以Hi我

在VS2005中设置WPF中自定义按钮的事件

原文:在VS2005中设置WPF中自定义按钮的事件

上篇讲了如何在Blend中绘制圆角矩形(http://blog.csdn.net/johnsuna/archive/2007/08/13/1740781.aspx),本篇继续下一步骤,如何自定义按钮的事件。

(1)首先,在VS2005中打开上篇所建的项目(File - Open Project),找到LinearGradientButton.csproj(这是我这里的项目名称),打开之后,双击LinearGradientDemo.xaml.cs,在LinearGradientDemo的构造函数的上面,键入:
Color initColor;//这句用来保存最初的按钮底色值

(2)在你所看到LinearGradientDemo的构造函数中有句this.InitializeComponent();,再在下面键入如下用灰色底突出颜色的代码,得到:
??????? public LinearGradientDemo()
??{
???this.InitializeComponent();

??????????? this.RoundRect_LinearGradientBottom.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(ClickRect_MouseLeftButtonDown);
??????????? this.RoundRect_LinearGradientBottom.MouseEnter += new System.Windows.Input.MouseEventHandler(EnterButton);
??????????? this.RoundRect_LinearGradientBottom.MouseLeave += new System.Windows.Input.MouseEventHandler(LeaveButton);
??????????? initColor = ((SolidColorBrush)(this.RoundRect_Bg.Fill)).Color;

??}
说明:
(a)这里的ClickRect_MouseLeftButtonDown是当鼠标左键在按钮上(确切地说是在RoundRect_LinearGradientBottom这个圆角矩形上)按下之后所发生的事件。
(b)EnterButton则是当鼠标进入RoundRect_LinearGradientBottom后所发生的事件(MouseEnter)。
(c)LeaveButton是当鼠标离开RoundRect_LinearGradientBottom后所发生的事件(MouseLeave)。

(3)键入下面代码:
??????? void ClickRect_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
??????? {
??????????? MessageBox.Show("你点击我了!");
??????? }

??????? void EnterButton(object sender, System.Windows.Input.MouseEventArgs e)
??????? {
??????????? this.RoundRect_Bg.Fill = new SolidColorBrush(Color.FromArgb(255, 200, 100, 0));
??????? }

??????? void LeaveButton(object sender, System.Windows.Input.MouseEventArgs e)
??????? {
??????????? this.RoundRect_Bg.Fill = new SolidColorBrush(initColor);
??????? }

(4)按F5或Ctrl+F5运行它,得到如下所示界面:
技术分享图片
当鼠标移进按钮时,颜色变了,离开后按钮颜色恢复为最初的颜色。
当鼠标点击按钮时,弹出“你点击我了!”的对话框。

这里用到了System.Windows.Shapes.Rectangle从UIElement继承的各种公共事件(详见SDK:ms-help://MS.LHSMSSDK.1033/MS.LHSNETFX30SDK.1033/fxref_presentationcore/html/229bc431-4295-fd39-706f-09abde5e7be5.htm)来实现自定义控件的事件处理。




























以上是关于VS菜鸟请教WPF编程中按钮事件的问题:Click和Click_1的主要内容,如果未能解决你的问题,请参考以下文章

WPF C#为动态创建的按钮创建Click事件

请教关于WPF上自定义控件添加事件的问题

关于wpf中按钮关闭原窗口,开启新窗口

VS C#编程 是WPF程序 如何改变ellipse控件的填充颜色 要在按下按钮1时为红色,按下按钮2变为绿色 求助?

在VS2005中设置WPF中自定义按钮的事件

WPF中,怎样设置点击按钮关闭当前窗口