C# WPF菜单项与鼠标仍处于按下状态时新窗口中的按钮行为

C# WPF菜单项与鼠标仍处于按下状态时新窗口中的按钮行为,c#,wpf,button,menuitem,onmousedown,C#,Wpf,Button,Menuitem,Onmousedown,我不知道如何在标题中更清楚地说明“问题”(不同的行为),但我会在这里解释 在我们的WPF应用程序中,我们使用DataGrid控件列出许多实体。双击一行后,我们打开一个新窗口,在该窗口中,有几个菜单项控件 问题是,当窗口在某个位置打开时,其中一个菜单项位于鼠标指针的正下方,该菜单项实际上是在双击鼠标上方单击的 当我们改用按钮时,按钮单击事件不会在相同情况下自动触发 我们现在正在考虑使用按钮而不是菜单项(或创建自定义菜单),但也许这里有人有一个解释或解决方案来改变这种行为?就我个人而言,我想不出这样

我不知道如何在标题中更清楚地说明“问题”(不同的行为),但我会在这里解释

在我们的WPF应用程序中,我们使用DataGrid控件列出许多实体。双击一行后,我们打开一个新窗口,在该窗口中,有几个菜单项控件

问题是,当窗口在某个位置打开时,其中一个菜单项位于鼠标指针的正下方,该菜单项实际上是在双击鼠标上方单击的

当我们改用按钮时,按钮单击事件不会在相同情况下自动触发

我们现在正在考虑使用按钮而不是菜单项(或创建自定义菜单),但也许这里有人有一个解释或解决方案来改变这种行为?就我个人而言,我想不出这样做会有什么好处。提前谢谢

下面是示例代码。要了解我的意思,请双击DataGrid行以打开新窗口并按住鼠标按钮,移动到菜单项并放开鼠标按钮(在TestWindow.xaml中,将菜单项交换为按钮控件以查看行为的差异):

MainWindow.xaml

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Style x:Key="DataGridRowStyle"
           TargetType="{x:Type DataGridRow}">
        <EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick" />
    </Style>
</Window.Resources>
<DataGrid RowStyle="{StaticResource DataGridRowStyle}" x:Name="MyDataGrid">
    <DataGrid.Columns>
        <DataGridTextColumn Header="String" Binding="{Binding}" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>
<Window x:Class="WpfApplication2.TestWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="TestWindow" Height="300" Width="300">
<Grid>
    <MenuItem Header="Test" Click="Button_Click" />
</Grid>

您可以尝试修改DataGridRow\u MouseDoubleClick处理程序,如下所示:

private void DataGridRow_MouseDoubleClick( object sender, MouseButtonEventArgs e )
{
    this.Dispatcher.BeginInvoke(
        ( Action )delegate
        {
            TestWindow window = new TestWindow();
            window.Show();
            window.Activate();
        },
        System.Windows.Threading.DispatcherPriority.Background,
        null
        );
}

在创建新窗口之前,让未完成的事件“解决”可能会解决问题。

谢谢您的回答,但它不起作用。如果可行的话,这也不是最好的解决方案,但话说回来,似乎没有一个好的解决方案
public partial class TestWindow : Window
{
    public TestWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
}
private void DataGridRow_MouseDoubleClick( object sender, MouseButtonEventArgs e )
{
    this.Dispatcher.BeginInvoke(
        ( Action )delegate
        {
            TestWindow window = new TestWindow();
            window.Show();
            window.Activate();
        },
        System.Windows.Threading.DispatcherPriority.Background,
        null
        );
}