为什么在 PreviewMouseDown 事件中以同步的方式启动一个新进程打乱了事件顺序? (鼠标松开显示在鼠标按下事件之前)

问题描述 投票:0回答:0

我认为我刚刚在 .NET 中遇到了一些错误,当我在预览鼠标按下事件中放置一个同步过程时,它会导致鼠标弹起事件在所有应该发生的鼠标按下事件之前显示。

当我将新流程放入任务中时,它是正确的顺序输出:

DockPanel_PreviewMouseLeftButtonDown
Bell_Image_PreviewMouseLeftButtonDown
Bell_Image_MouseLeftButtonDown
DockPanel_MouseLeftButtonDown
DockPanel_PreviewMouseUp
Bell_Image_PreviewMouseUp
Bell_Image_MouseUp
DockPanel_MouseUp

但是当在“DockPanel_PreviewMouseUp”中同步启动进程时,输出是:

DockPanel_PreviewMouseLeftButtonDown
DockPanel_PreviewMouseUp
Bell_Image_PreviewMouseUp
Bell_Image_MouseUp
DockPanel_MouseUp
Bell_Image_PreviewMouseLeftButtonDown
Bell_Image_MouseLeftButtonDown
DockPanel_MouseLeftButtonDown

为什么会这样?谢谢

导致事件顺序混乱的代码:

XAML:

<DockPanel MouseLeftButtonDown="DockPanel_MouseLeftButtonDown" PreviewMouseLeftButtonDown="DockPanel_PreviewMouseLeftButtonDown" MouseUp="DockPanel_MouseUp" PreviewMouseUp="DockPanel_PreviewMouseUp">
            <Grid>
                <Image x:Name="Bell_Image" Source="Bell.png" PreviewMouseLeftButtonDown="Bell_Image_PreviewMouseLeftButtonDown" MouseLeftButtonDown="Bell_Image_MouseLeftButtonDown" MouseUp="Bell_Image_MouseUp" PreviewMouseUp="Bell_Image_PreviewMouseUp"/>
            </Grid>
 </DockPanel> 

C# 背后的代码:

        private void Bell_Image_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("Bell_Image_PreviewMouseLeftButtonDown");
        }

        private void Bell_Image_MouseUp(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("Bell_Image_MouseUp");
        }

        private void DockPanel_MouseUp(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("DockPanel_MouseUp");
        }

        private void DockPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("DockPanel_MouseLeftButtonDown");
        }

        private void Bell_Image_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("Bell_Image_PreviewMouseUp");
        }

        private void DockPanel_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("DockPanel_PreviewMouseUp");
        }

        private void Bell_Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("Bell_Image_MouseLeftButtonDown");
        }

        private void DockPanel_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Console.WriteLine("DockPanel_PreviewMouseLeftButtonDown");
            Process.Start("Some_File.pdf");
        }

我希望它不会打乱事件的顺序,有兴趣知道这是一个错误还是有解释

c# .net wpf xaml mouseevent
© www.soinside.com 2019 - 2024. All rights reserved.