Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PreviewMouseUp和PreviewMouseDown上的WPF按钮的行为不同_Wpf_Button - Fatal编程技术网

PreviewMouseUp和PreviewMouseDown上的WPF按钮的行为不同

PreviewMouseUp和PreviewMouseDown上的WPF按钮的行为不同,wpf,button,Wpf,Button,我正在试验OnPreviewMouseUp和OnPreviewMouseDown隧道事件。我对e.OriginalSource特别感兴趣,因为我不明白为什么当我单击按钮的文本内容时,e.OriginalSource仍然是按钮本身,而不是文本块-按钮的可视子项。事实上,我发现OnPreviewMouseDown事件确实实现了我的预期——它将e.OriginalSource显示为文本块,而OnPreviewMouseUp事件始终将e.OriginalSource显示为按钮本身。以下是我在本实验中使用

我正在试验OnPreviewMouseUp和OnPreviewMouseDown隧道事件。我对e.OriginalSource特别感兴趣,因为我不明白为什么当我单击按钮的文本内容时,e.OriginalSource仍然是按钮本身,而不是文本块-按钮的可视子项。事实上,我发现OnPreviewMouseDown事件确实实现了我的预期——它将e.OriginalSource显示为文本块,而OnPreviewMouseUp事件始终将e.OriginalSource显示为按钮本身。以下是我在本实验中使用的简单代码:

XAML:


我怀疑这与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}");
    }