WPF MenuItem vs поведение кнопок в новом окне, когда мышь еще не нажата - PullRequest
1 голос
/ 26 июля 2010

Я не знал, как сделать «проблему» (другое поведение) более понятной в заголовке, но я объясню здесь.

В нашем приложении WPF мы используем элемент управления DataGridперечислить количество лиц.После двойного щелчка по строке мы открываем новое окно, и в этом окне, помимо прочего, есть пара элементов управления MenuItem.

Проблема заключается в том, что когда окно открывается в позиции, где один из пунктов менюнаходится прямо под указателем мыши, пункт меню фактически щелкается там при наведении мыши на двойной щелчок.

Когда мы используем вместо этого кнопку, событие нажатия кнопки не запускается автоматически в той же ситуации.

Мы сейчас думаем об использовании кнопок вместо пунктов меню (или создании пользовательских меню), но, возможно, у кого-то здесь есть объяснение или решение, чтобы изменить это поведение?Лично я не могу вспомнить случай, когда это вообще было бы полезно.Заранее спасибо!

Пример кода приведен ниже.Чтобы понять, что я имею в виду, дважды щелкните строку DataGrid, чтобы открыть новое окно, и удерживайте нажатой кнопку мыши, перейдите к элементу меню и отпустите кнопку мыши (в TestWindow.xaml замените элемент MenuItem на элемент управления Button, чтобы увидетьразница в поведении):

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>

MainWindow.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();
    }
}

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

TestWindow.xaml.cs

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

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

1 Ответ

0 голосов
/ 27 июля 2010

Вы можете попробовать изменить обработчик 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
        );
}

Это могло бы решить проблему, позволяя ожидающим событиям "урегулироваться" перед созданием нового окна.

...