我不知道如何使标题中的“问题”(不同的行为)更清楚,但我会在这里解释。
在我们的 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();
}
}