Button中MouseLeftButtonDown和MouseLeftButtonUp事件无法触发的解决方案

在做按钮拖曳功能时,发现跟踪不了断点,MouseLeftButtonDown事件不能触发,后来查阅资料发现问题的原因了,特此转载一下学习了。

 

鼠标事件处理实现简单的拖放功能。

  在实现拖放功能中,分为三个步骤:

  1.按下鼠标,触发 MouseLeftButtonDown 事件,选择要拖动的对象。

  2.移动鼠标,触发 MouseMove 事件,移动选择的对象。

  3.放开鼠标,触发 MouseLeftButtonUp 事件,停止捕捉事件。

  但是在实际运行过程中,只能触发MouseMove事件,不能触发MouseLeftButtonDown和MouseLeftButtonUp事件。经过查阅资料,发现这跟路由顺序有关,控件在捕获了MouseLeftButtonDown或MouseLeftButtonUp事件后,会将该事件的"Handled"设置为true,这个属性是用在路由事件中的,当某个控件得到一个RoutedEvent,就会检测Handled是否为true,为true则忽略该事件。并且,控件本身的Click事件,相当于将MouseLeftButtonDown和MouseLeftButtonUp事件抑制掉了,转换成了Click事件。

  解决方案一(部分解决问题):

  设置Button的ClickMode 属性:

 

 

成员名称

说明

 

Release

指定当按下并松开鼠标左键且鼠标指针位于控件上方时应引发 Click 事件。如果使用的是键盘,则指定在按下并松开空格键或 Enter 键且控件具有键盘焦点时应引发 Click 事件。

 

Press

指定在按下鼠标按键且鼠标指针位于控件上方时应引发 Click 事件。如果使用的是键盘,则指定在按下空格键或 Enter 且控件具有键盘焦点时应引发 Click 事件。

 

Hover

指定当鼠标指针在控件上移动时应引发 Click 事件。

 

  但是此方法并不能完全解决问题,能达到触发事件的目的,但是不能实现所需的拖放功能。

  解决方案二(完美解决问题):

  在初始化的函数里利用UIElement的AddHandler方法,显式的增加这个事件。

  方法说明:

  UIElement.AddHandler方法 (RoutedEvent, Delegate, Boolean)

  为指定的路由事件添加路由事件处理程序,并将该处理程序添加到当前元素的处理程序集合中。将 handledEventsToo 指定为 true 时,可为已标记为由其他元素在事件路由过程中处理的路由事件调用所提供的处理程序。

  参数说明:

  routedEvent

  类型:System.Windows..::..RoutedEvent

  要处理的路由事件的标识符。

  handler

  类型:System..::..Delegate

  对处理程序实现的引用。

  handledEventsToo

  类型:System..::.Boolean

  如果为 true,则将按以下方式注册处理程序:即使路由事件在其事件数据中标记为已处理,也会调用该处理程序;如果为 false,则使用默认条件注册处理程序,即当路由事件被标记为已处理时,将不调用处理程序。

  默认值为 false。

  初始化函数里面添加的代码:

  完整代码:

  前台:

 

后台:

   

本文来自giser2007的博客,原文地址:http://www.cnblogs.com/junyuz/archive/2010/12/30/1921672.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将C#MouseLeftButtonDown事件绑定到命令,可以使用以下步骤: 1. 在XAML添加事件触发器: ``` <Button Content="Click Me" MouseLeftButtonDown="Button_MouseLeftButtonDown"/> ``` 2. 在C#创建命令和命令绑定器: ``` public class MyCommand : ICommand { public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) { return true; } public void Execute(object parameter) { // 命令要执行的代码 } } public class MyCommandBinding : DependencyObject { public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached( "Command", typeof(ICommand), typeof(MyCommandBinding), new PropertyMetadata(null, CommandPropertyChanged)); public static ICommand GetCommand(DependencyObject obj) { return (ICommand)obj.GetValue(CommandProperty); } public static void SetCommand(DependencyObject obj, ICommand value) { obj.SetValue(CommandProperty, value); } private static void CommandPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { var element = obj as UIElement; if (element != null) { element.MouseLeftButtonDown += (sender, args) => { var command = e.NewValue as ICommand; if (command != null && command.CanExecute(null)) { command.Execute(null); } }; } } } ``` 3. 在XAML绑定命令: ``` <Button Content="Click Me" local:MyCommandBinding.Command="{Binding MyCommand}"/> ``` 这将使用自定义的命令绑定器将命令绑定到MouseLeftButtonDown事件。当按钮被点击时,命令将被执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值