惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - 颜昌钢

怎样做好一个项目经理? ICollection 与 IList 区别 oracle 数据库跨库查询方法 SetTimeOut 与 SetInterval 区别 - 颜昌钢 内存释放 机制 remoting 学习整理 wpf windows 放大缩小 疑问?? - 颜昌钢 GC 资源 回收 WPF中代码画箭头 方法参数 Ref 与 引用类型 DataTrigger 以及 EnterActions 和ExitActions 学习笔记 - 颜昌钢 WPF xaml文件中使用大括号{} - 颜昌钢 - 博客园 WPF下的地图解决方案 关于WPF的Binding 的 ConverterParameter 参数的动态设置 关于 项目 投标相关文档 服务器计时器、Windows 计时器和线程计时器 wpf小控件 集合 仪表盘等 c# 插件 体系 一个类似于 splittercontainer 控件的控件
wpf button 事件的触发顺序 - 颜昌钢
颜昌钢 · 2009-05-31 · via 博客园 - 颜昌钢

今天做一个wpf用户控件的时候,对Button的MouseLeftButtonDown事件实在是触发不了,所以,编写了个简单的demo来测试Button的事件的触发顺序.直接上代码:

<Button Name="btnTop" Width="300" Height="300"
            Tag="Top   "  
           
            PreviewMouseLeftButtonDown="MyRoutedEventHandler"
            PreviewMouseDown="MyRoutedEventHandler"
            PreviewMouseUp="MyRoutedEventHandler"
            PreviewMouseLeftButtonUp="MyRoutedEventHandler"
           
            MouseLeftButtonDown="MyRoutedEventHandler"
            MouseDown="MyRoutedEventHandler"
            Click="MyRoutedEventHandler"
            MouseDoubleClick="MyRoutedEventHandler"
            MouseUp="MyRoutedEventHandler"
            MouseLeftButtonUp="MyRoutedEventHandler"
            >

  private void MyRoutedEventHandler(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine(string.Format("\t{0:mm:ss}\t{1}\t{2}", DateTime.Now, ((Button)sender).Tag, e.RoutedEvent.Name));
        }

输出:

 24:05 Top    PreviewMouseLeftButtonDown
 24:05 Top    PreviewMouseDown
 24:05 Top    PreviewMouseLeftButtonUp
 24:05 Top    PreviewMouseUp
 24:05 Top    Click

感觉到,还是有很多的事件没有执行,非常的郁闷。

查看wpf的事件的相关文档,太TMD高深了,

http://www.docin.com/p-3021557.html

为了解决这个问题,修改成如下的代码:

   <Button Name="btnTop" Width="300" Height="300"
            Tag="Top   "  
           
            PreviewMouseLeftButtonDown="MyRoutedEventHandler"
            PreviewMouseDown="MyRoutedEventHandler"
            PreviewMouseUp="MyRoutedEventHandler"
            PreviewMouseLeftButtonUp="MyRoutedEventHandler"
           
            MouseLeftButtonDown="btnTop_MouseLeftButtonDown"
            MouseDown="btnTop_MouseLeftButtonDown"
            Click="MyRoutedEventHandler"
            MouseDoubleClick="MyRoutedEventHandler"
            MouseUp="btnTop_MouseLeftButtonDown"
            MouseLeftButtonUp="btnTop_MouseLeftButtonDown"
            >

  private void MyRoutedEventHandler(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine(string.Format("\t{0:mm:ss}\t{1}\t{2}", DateTime.Now, ((Button)sender).Tag, e.RoutedEvent.Name));
            e.Handled = true;
        }

        private void btnTop_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Debug.WriteLine(string.Format("\t{0:mm:ss}\t{1}\t{2}", DateTime.Now, ((Button)sender).Tag, e.RoutedEvent.Name));
        }

输出:

29:20 Top    PreviewMouseLeftButtonDown
 29:20 Top    PreviewMouseLeftButtonUp

靠,更少了、、、

在改:

   <Button Name="btnTop" Width="300" Height="300"
            Tag="Top   "  
           
            PreviewMouseLeftButtonDown="MyRoutedEventHandler"
            PreviewMouseDown="MyRoutedEventHandler"
            PreviewMouseUp="MyRoutedEventHandler"
            PreviewMouseLeftButtonUp="MyRoutedEventHandler"
           
            MouseLeftButtonDown="btnTop_MouseLeftButtonDown"
            MouseDown="btnTop_MouseLeftButtonDown"
            Click="MyRoutedEventHandler"
            MouseDoubleClick="MyRoutedEventHandler"
            MouseUp="btnTop_MouseLeftButtonDown"
            MouseLeftButtonUp="btnTop_MouseLeftButtonDown"
            >

  public Window1()
        {
            InitializeComponent();
            btnTop.AddHandler(Button.MouseLeftButtonDownEvent, new RoutedEventHandler(btnTop_MouseLeftButtonDown), true);
            btnTop.AddHandler(Button.MouseDownEvent, new RoutedEventHandler(btnTop_MouseLeftButtonDown), true);
            btnTop.AddHandler(Button.MouseUpEvent, new RoutedEventHandler(btnTop_MouseLeftButtonDown), true);
            btnTop.AddHandler(Button.MouseLeftButtonUpEvent, new RoutedEventHandler(btnTop_MouseLeftButtonDown), true);

        }
        private void MyRoutedEventHandler(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine(string.Format("\t{0:mm:ss}\t{1}\t{2}", DateTime.Now, ((Button)sender).Tag, e.RoutedEvent.Name));
          
        }

        private void btnTop_MouseLeftButtonDown(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine(string.Format("\t{0:mm:ss}\t{1}\t{2}", DateTime.Now, ((Button)sender).Tag, e.RoutedEvent.Name));
        }

输出:

 31:41 Top    PreviewMouseLeftButtonDown
 31:41 Top    PreviewMouseDown
 31:41 Top    MouseLeftButtonDown
 31:41 Top    MouseDown
 31:41 Top    PreviewMouseLeftButtonUp
 31:41 Top    PreviewMouseUp
 31:41 Top    Click
 31:41 Top    MouseLeftButtonUp
 31:41 Top    MouseUp

靠,总算成功了,

但是,似乎不爽,因为Button的MouseLeftButtonDown等事件是MouseButtonEventHandler。

在修改:

            btnTop.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(btnTop_MouseLeftButtonDown), true);
            btnTop.AddHandler(Button.MouseDownEvent, new MouseButtonEventHandler(btnTop_MouseLeftButtonDown), true);
            btnTop.AddHandler(Button.MouseUpEvent, new MouseButtonEventHandler(btnTop_MouseLeftButtonDown), true);
            btnTop.AddHandler(Button.MouseLeftButtonUpEvent, new MouseButtonEventHandler(btnTop_MouseLeftButtonDown), true);

输出:

 35:04 Top    PreviewMouseLeftButtonDown
 35:04 Top    PreviewMouseDown
 35:05 Top    MouseLeftButtonDown
 35:05 Top    MouseDown
 35:05 Top    PreviewMouseLeftButtonUp
 35:05 Top    PreviewMouseUp
 35:05 Top    Click
 35:05 Top    MouseLeftButtonUp
 35:05 Top    MouseUp

代码奉上,但是,没任何讲解。