Button中MouseLeftButtonDown和MouseLeftButtonUp事件无法触发的解决方案
2011-04-08 15:09
477 查看
在做按钮拖曳功能时,发现跟踪不了断点,MouseLeftButtonDown事件不能触发,后来查阅资料发现问题的原因了,特此转载一下学习了。
鼠标事件处理实现简单的拖放功能。
在实现拖放功能中,分为三个步骤:
1.按下鼠标,触发 MouseLeftButtonDown 事件,选择要拖动的对象。
2.移动鼠标,触发 MouseMove 事件,移动选择的对象。
3.放开鼠标,触发 MouseLeftButtonUp 事件,停止捕捉事件。
但是在实际运行过程中,只能触发MouseMove事件,不能触发MouseLeftButtonDown和MouseLeftButtonUp事件。经过查阅资料,发现这跟路由顺序有关,控件在捕获了MouseLeftButtonDown或MouseLeftButtonUp事件后,会将该事件的"Handled"设置为true,这个属性是用在路由事件中的,当某个控件得到一个RoutedEvent,就会检测Handled是否为true,为true则忽略该事件。并且,控件本身的Click事件,相当于将MouseLeftButtonDown和MouseLeftButtonUp事件抑制掉了,转换成了Click事件。
解决方案一(部分解决问题):
设置Button的ClickMode 属性:
但是此方法并不能完全解决问题,能达到触发事件的目的,但是不能实现所需的拖放功能。
解决方案二(完美解决问题):
在初始化的函数里利用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.按下鼠标,触发 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。
初始化函数里面添加的代码:
bt1.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.Button_MouseLeftButtonDown), true); bt1.AddHandler(Button.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.Button_MouseLeftButtonUp), true);
完整代码:
前台:
<UserControl x:Class="sample.s5" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Canvas> <Button Canvas.Left="50" Canvas.Top="50" Width="200" Height="120" FontSize="20" x:Name="bt1" MouseLeftButtonDown="Button_MouseLeftButtonDown" MouseMove="Button_MouseMove" MouseLeftButtonUp="Button_MouseLeftButtonUp" Click="bt1_Click" ClickMode="Release"> <Button.Content> <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center"> <Image Source="HandPrints.jpg" Width="200" Height="70"></Image> <TextBlock Text="拖动我" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock> </StackPanel> </Button.Content> </Button> <TextBlock Text="测试" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" MouseMove="TextBlock_MouseMove" MouseLeftButtonUp="TextBlock_MouseLeftButtonUp" Height="35" Width="85"></TextBlock> </Canvas> </UserControl>
后台:
public partial class s5 : UserControl
{
bool trackMouseMove = false;
Point mousePostion;
public s5()
{
InitializeComponent();
bt1.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(this.Button_MouseLeftButtonDown), true); bt1.AddHandler(Button.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.Button_MouseLeftButtonUp), true);
}
private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement element = (FrameworkElement)sender;
//指定相对于整个Silverlight 坐标括系的对象
mousePostion = e.GetPosition(null);
trackMouseMove = true;
if (element != null)
{
element.CaptureMouse();
element.Cursor = Cursors.Hand;
}
}
private void Button_MouseMove(object sender, MouseEventArgs e)
{
FrameworkElement element = (FrameworkElement)sender;
if (trackMouseMove)
{
double deltaV = e.GetPosition(null).Y - mousePostion.Y;
double deltaH = e.GetPosition(null).X - mousePostion.X;
double newTop = deltaV + (double)element.GetValue(Canvas.TopProperty);
double newLeft = deltaH + (double)element.GetValue(Canvas.LeftProperty);
element.SetValue(Canvas.TopProperty, newTop);
element.SetValue(Canvas.LeftProperty, newLeft);
mousePostion = e.GetPosition(null);
}
}
private void Button_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
FrameworkElement element = (FrameworkElement)sender;
trackMouseMove = false;
element.ReleaseMouseCapture();
mousePostion.X = mousePostion.Y = 0;
element.Cursor = null;
}
}
本文来自giser2007的博客,原文地址:http://www.cnblogs.com/junyuz/archive/2010/12/30/1921672.html
相关文章推荐
- Button中MouseLeftButtonDown和MouseLeftButtonUp事件无法触发的解决方案
- Button中 MouseLeftButtonDown和MouseLeftButtonUp 事件无法触发的解决方案 (转)
- silverlight MouseLeftButtonDown事件总是无法触发
- MouseLeftButtonDown事件无法触发
- silverlight MouseLeftButtonDown事件总是无法触发
- MouseLeftButtonDown事件无法触发
- silverlight中button无法触发MouseLeftButtonDown等事件
- silverlight MouseLeftButtonDown事件无法触发
- Android的Button按钮,ACTION_UP事件不触发解决方案
- Android的Button按钮,ACTION_UP事件不触发解决方案
- Android的Button按钮,ACTION_UP事件不触发解决方案
- 如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题
- Android的Button按钮,ACTION_UP事件不触发解决方案
- silverlight MouseLeftButtonDown无法触发解决办法
- Android的Button按钮,ACTION_UP事件不触发解决方案
- WPF 窗体拖转时不触发MouseLeftButtonUpEvent
- SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题
- 解决MouseLeftButtonDown在Grid等布局中无法响应事件 - [Silverlight开发]
- WPF InkCanvas MouseDown及MouseLeftButtonDown事件不触发的代替事件
- MouseLeftButtonDown 事件不触发