タイトルで「問題」(動作の違い)をより明確にする方法がわかりませんでしたが、ここで説明します。
WPFアプリケーションでは、DataGridコントロールを使用して多数のエンティティを一覧表示しています。行をダブルクリックした後、新しいウィンドウを開きます。そのウィンドウには、とりわけMenuItemコントロールがいくつかあります。
問題は、メニュー項目の1つがマウスポインタの真下にある位置でウィンドウが開いたときに、ダブルクリックのマウスアップでメニュー項目が実際にクリックされることです。
代わりにボタンを使用すると、同じ状況でボタンクリックイベントが自動的に発生しません。
現在、メニュー項目の代わりにボタンを使用する(またはカスタムメニューを作成する)ことを考えていますが、おそらくここの誰かがこの動作を変更するための説明または解決策を持っていますか?個人的には、これがまったく有益なケースは考えられません。前もって感謝します!
サンプルコードは以下のとおりです。意味を確認するには、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();
}
}