WPF 附加事件
2013-09-10 20:51 Andrew.Wangxu 阅读(1364) 评论(1) 编辑 收藏 举报在WPF中有许多控件有他们自己的特殊的事件。按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件。
这回导致两难的境地。假设在 StackPanel 面板中包装了一堆按钮,并且希望在一个事件处理程序中处理所有这些按钮的单击事件。粗略的方法是将每个按钮 Click 事件都注册到同一个事件处理方法中。但是 Click 事件支持事件冒泡,从而提供了更好的一种选择。可以通过处理更高层次的元素的 Click 事件(如包含按钮的 StackPanel 面板)来处理所有的按钮单击事件。
这里会遇到一个问题,在StackPanel面板中并没有Click事件,正如上所说“按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件。”,所以 XAML 解析器会解释成一个错误。解决方案是以“类名.事件名”的形式使用不同的关联事件语法。下面是示例:
<StackPanel Name="panel1" Button.Click="StackPanel_Click_1" Margin="5"> <Button Name="cmd1" Tag="1">Command 1</Button> <Button Name="cmd2" Tag="2">Command 2</Button> <Button Name="cmd3" Tag="3">Command 3</Button> </StackPanel>
现在事件处理程序就可以接收到 StackPanel 面板中包含的所有按钮单击事件了。
也可以在代码中关联附加事件,但是需要使用 UIElement.AddHandler() 方法,而不能使用 += 运算符语法。下面是一个示例(该示例假设 StackPanle 面板已经被命名为 pnlButtons ):
pnlButtons.AddHandler(Button.Click, new RoutedEventHandler(StackPanel_Click_1));
在 StackPanel_Click_1 事件处理方法中进行处理程序。
下面是一个完整的例子:
XAML
<Window x:Class="_1016_AppendEvent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <StackPanel Name="panel1" Button.Click="StackPanel_Click_1" Margin="5"> <Button Name="cmd1" Tag="1">Command 1</Button> <Button Name="cmd2" Tag="2">Command 2</Button> <Button Name="cmd3" Tag="3">Command 3</Button> </StackPanel> </Window>
C#:
private void StackPanel_Click_1(object sender, RoutedEventArgs e) { MessageBox.Show(e.Source.ToString()); }
源码下载:https://files.cnblogs.com/andrew-blog/1016_AppendEvent.rar
开发工具:VS2012
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人