1

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

在我们的 WPF 应用程序中,我们使用 DataGrid 控件来列出许多实体。双击一行后,我们打开一个新窗口,在该窗口中,除其他外,还有几个 MenuItem 控件。

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

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

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

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

主窗口.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>

主窗口.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        ObservableCollection<string> myCollection = new ObservableCollection<string>();

        myCollection.Add("test");

        MyDataGrid.ItemsSource = myCollection;

        this.DataContext = this;
    }

    private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        TestWindow window = new TestWindow();
        window.Show();
        window.Activate();
    }
}

测试窗口.xaml

<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>

测试窗口.xaml.cs

public partial class TestWindow : Window
{
    public TestWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
}
4

1 回答 1

0

您可以尝试修改DataGridRow_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
        );
}

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

于 2010-07-27T03:45:13.193 回答