这是我的 XAML:
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="844.025" Width="678" MouseUp="somethingClicked">
<Grid MouseUp="somethingClicked">
<StackPanel MouseUp="somethingClicked" Margin="0,0,10,0">
<Button x:Name="btnClickMe" Content="Click Me!" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="101,22,0,0" MouseUp="somethingClicked"/>
<CheckBox x:Name="chkhandle" Content="CheckBox" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="241,28,0,0" RenderTransformOrigin="-0.588,1.188"/>
<ListBox x:Name="lstEvents" HorizontalAlignment="Left" Height="604" VerticalAlignment="Top" Width="416" Margin="29,66,0,0"/>
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
这是 C# 代码:
namespace WpfApplication4
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
protected int eventCounter = 0;
public MainWindow()
{
InitializeComponent();
}
private void somethingClicked(object sender, RoutedEventArgs e)
{
eventCounter++;
String message = "#" + eventCounter.ToString() + ":\r\n" +
" Sender: " + sender.ToString() + ":\r\n" +
" Source: " + e.Source + ":\r\n" +
" Original Source: " + e.OriginalSource;
lstEvents.Items.Add(message);
e.Handled = (bool) chkhandle.IsChecked;
if (e.Handled)
lstEvents.Items.Add("Completed");
}
}
Run Code Online (Sandbox Code Playgroud)
}
我在此示例中遇到以下问题: 1) 单击按钮时不会触发 MouseUp 事件。2)事件不会冒泡。单击表单上的某处将显示:
Sender:WpfApplication4.MainWindow:
Source:WpfApplication4.MainWindow:
Original Source: System.Windows.Controls.Border.
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,当单击按钮时,首先应该在窗口级别执行(现在就是这样),然后是网格,然后是堆栈,最后是文本标签。是代码错误还是我对概念的理解错误?
The MouseUp event is not fired on clicking the button.
因为第一次触发的是 处的事件Button.Click,而当它起作用时,它与事件 发生冲突MouseUp。引用自这里:
ButtonBase继承自UIElement,Button还可以访问为UIElement定义的所有鼠标按钮事件。因为 Button 会响应按钮按下而执行某些操作,所以它会吞掉冒泡事件(例如 MouseLeftButtonDown 和 MouseDown)。您仍然可以通过添加隧道事件的处理程序(例如 PreviewMouseLeftButtonDown 和 PreviewMouseDown)来检测这些较低级别的按钮按下事件。
尝试替换Buttonon Label,你会得到想要的结果:

| 归档时间: |
|
| 查看次数: |
5756 次 |
| 最近记录: |