有人知道如何实现一个双击事件处理程序,以新窗口成为最前面窗口的方式打开一个新窗口吗? (只是通常预期的行为)。
在WPF中,在双击事件处理程序中打开第二个窗口时,会出现奇怪的窗口行为。第二个窗口打开,但第一个窗口(双击事件被触发)立即再次激活。 在单击事件处理程序中打开一个窗口,按预期工作。第二个窗口打开并保持前窗。
出于演示目的,我创建了以下应用程序。两个窗口类只有一个按钮控件。要区分单击并双击按钮控件,单击事件仅在按下左移键时才有效。
http://blog.mutter.ch/wp-content/uploads/2014/05/wpf_window1.png
http://blog.mutter.ch/wp-content/uploads/2014/05/wpf_window2.png
<Window x:Class="WpfWindowSwitching.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="200" Width="600">
<Grid>
<Button Margin="40"
HorizontalAlignment="Center"
VerticalAlignment="Center"
MouseDoubleClick="doubleClick"
Click="click">
<TextBlock FontWeight="Bold"
FontSize="22">
I am the first Window, double click this button...
</TextBlock>
</Button>
</Grid>
</Window>
背后的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void doubleClick(object sender, MouseButtonEventArgs e)
{
openNewWindow();
}
private static void openNewWindow()
{
var window = new SecondWindow();
window.Show();
}
private void click(object sender, RoutedEventArgs e)
{
if (!Keyboard.IsKeyDown(Key.LeftShift)) return;
openNewWindow();
}
}
<Window x:Class="WpfWindowSwitching.SecondWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SecondWindow" Height="200" Width="600">
<Grid>
<Button Margin="40"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Click="click">
<TextBlock FontWeight="Bold"
FontSize="22">
I am the second Window
</TextBlock>
</Button>
</Grid>
</Window>
背后的代码:
public partial class SecondWindow : Window
{
public SecondWindow()
{
InitializeComponent();
}
private void click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
答案 0 :(得分:4)
MouseDoubleClick
事件后,会引发 MouseUp
事件,并在MainWindow上处理。因此,辅助窗口会立即激活,随后事件冒泡,主窗口会被激活。
如果您不想要,可以通过在鼠标加倍后将 e.Handled
设置为 True
来明确停止事件冒泡点击事件。这样,辅助窗口将保持激活状态。
private void doubleClick(object sender, MouseButtonEventArgs e)
{
openNewWindow();
e.Handled = true;
}