C# WPF菜单项与鼠标仍处于按下状态时新窗口中的按钮行为
我不知道如何在标题中更清楚地说明“问题”(不同的行为),但我会在这里解释 在我们的WPF应用程序中,我们使用DataGrid控件列出许多实体。双击一行后,我们打开一个新窗口,在该窗口中,有几个菜单项控件 问题是,当窗口在某个位置打开时,其中一个菜单项位于鼠标指针的正下方,该菜单项实际上是在双击鼠标上方单击的 当我们改用按钮时,按钮单击事件不会在相同情况下自动触发 我们现在正在考虑使用按钮而不是菜单项(或创建自定义菜单),但也许这里有人有一个解释或解决方案来改变这种行为?就我个人而言,我想不出这样做会有什么好处。提前谢谢 下面是示例代码。要了解我的意思,请双击DataGrid行以打开新窗口并按住鼠标按钮,移动到菜单项并放开鼠标按钮(在TestWindow.xaml中,将菜单项交换为按钮控件以查看行为的差异): MainWindow.xamlC# WPF菜单项与鼠标仍处于按下状态时新窗口中的按钮行为,c#,wpf,button,menuitem,onmousedown,C#,Wpf,Button,Menuitem,Onmousedown,我不知道如何在标题中更清楚地说明“问题”(不同的行为),但我会在这里解释 在我们的WPF应用程序中,我们使用DataGrid控件列出许多实体。双击一行后,我们打开一个新窗口,在该窗口中,有几个菜单项控件 问题是,当窗口在某个位置打开时,其中一个菜单项位于鼠标指针的正下方,该菜单项实际上是在双击鼠标上方单击的 当我们改用按钮时,按钮单击事件不会在相同情况下自动触发 我们现在正在考虑使用按钮而不是菜单项(或创建自定义菜单),但也许这里有人有一个解释或解决方案来改变这种行为?就我个人而言,我想不出这样
<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
);
}