PreviewMouseUp和PreviewMouseDown上的WPF按钮的行为不同
我正在试验OnPreviewMouseUp和OnPreviewMouseDown隧道事件。我对e.OriginalSource特别感兴趣,因为我不明白为什么当我单击按钮的文本内容时,e.OriginalSource仍然是按钮本身,而不是文本块-按钮的可视子项。事实上,我发现OnPreviewMouseDown事件确实实现了我的预期——它将e.OriginalSource显示为文本块,而OnPreviewMouseUp事件始终将e.OriginalSource显示为按钮本身。以下是我在本实验中使用的简单代码: XAML:PreviewMouseUp和PreviewMouseDown上的WPF按钮的行为不同,wpf,button,Wpf,Button,我正在试验OnPreviewMouseUp和OnPreviewMouseDown隧道事件。我对e.OriginalSource特别感兴趣,因为我不明白为什么当我单击按钮的文本内容时,e.OriginalSource仍然是按钮本身,而不是文本块-按钮的可视子项。事实上,我发现OnPreviewMouseDown事件确实实现了我的预期——它将e.OriginalSource显示为文本块,而OnPreviewMouseUp事件始终将e.OriginalSource显示为按钮本身。以下是我在本实验中使用
我怀疑这与button的click事件有关,它会吞噬MouseUp事件,但我正试图确切地理解原因。您的猜测是正确的。如果右键单击,TextBlock将成为这两个事件的事件源。要了解原因,您必须了解按钮的源代码。你需要多少钱?真的有那么复杂吗?您可以在buttonbase中看到它处理单击并引发新事件。坦率地说,我从来没有觉得有必要把这件事弄清楚,但在我看来,这就是你看到这种行为的原因。httpss://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/Primitives/ButtonBase.cs,1001a15c43ab91f9
<StackPanel Margin="5">
<Button Name="cmd" Margin="8">Click me.</Button>
</StackPanel>
public partial class ButtonMouseUpEvent : System.Windows.Window
{
public ButtonMouseUpEvent()
{
InitializeComponent();
}
protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
{
base.OnPreviewMouseDown(e);
Debug.WriteLine($"OnPreviewMouseDown(): e.Source = {e.Source}, e.OriginalSource = {e.OriginalSource}");
}
protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
{
base.OnPreviewMouseUp(e);
Debug.WriteLine($"OnPreviewMouseUp(): e.Source = {e.Source}, e.OriginalSource = {e.OriginalSource}");
}