一、例子程序
cs
<Grid>
<Button Content="Click Me" HorizontalAlignment="Center" VerticalAlignment="Center"
MouseEnter="Button_MouseEnter"
PreviewMouseDown="Button_MouseDown"
PreviewMouseUp="Button_MouseUp"/>
</Grid>
cs
public Window2()
{
InitializeComponent();
}
// 当鼠标移入按钮时触发
private void Button_MouseEnter(object sender, MouseEventArgs e)
{
System.Diagnostics.Debug.WriteLine("鼠标移入");
// 或者如果你希望在UI中显示,可以更新TextBlock的Text属性等
}
// 当鼠标按下按钮时触发(可以看作是开始点击)
private void Button_MouseDown(object sender, MouseButtonEventArgs e)
{
System.Diagnostics.Debug.WriteLine("按钮点击(鼠标按下)");
// 注意:这里不是严格意义上的"按钮点击",而是鼠标按下的动作
}
// 当鼠标松开按钮时触发
private void Button_MouseUp(object sender, MouseButtonEventArgs e)
{
System.Diagnostics.Debug.WriteLine("按钮松开");
// 注意:如果你的按钮在MouseDown时触发了某些操作,并希望在MouseUp时撤销或完成这些操作,请在这里处理
}
二、MouseDown和MouseUp不触发问题解决方法
如果Button
控件的MouseDown
或MouseUp
事件没有按预期触发,这通常是因为这些事件在控件内部被标记为Handled
了。在WPF的事件路由机制中,一旦某个事件处理器将事件标记为已处理(e.Handled = true
),那么该事件就不会继续沿着事件路由传播,后续的处理器也就不会接收到该事件。
对于Button
控件来说,其内部逻辑可能会在某些情况下(如为了执行点击命令)自动将MouseDown
或MouseUp
事件标记为已处理。这意味着,如果你尝试在XAML中直接为Button
的MouseDown
或MouseUp
事件添加处理器,这些处理器可能不会被调用。
解决方法
使用PreviewMouseDown
和PreviewMouseUp
事件 :
这些事件在事件路由的"隧道"阶段触发,即在"冒泡"阶段之前。由于它们是在事件向上传播到Button
之前触发的,因此它们不太可能被Button
的内部逻辑标记为已处理。你可以在XAML中这样设置:并在后台代码中定义相应的事件处理器。
cs
<Button Content="Click Me" PreviewMouseDown="Button_PreviewMouseDown" PreviewMouseUp="Button_PreviewMouseUp" />