我认为我刚刚在 .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");
}
我希望它不会打乱事件的顺序,有兴趣知道这是一个错误还是有解释