WPF奇怪的窗口切换双击

时间:2014-05-25 19:40:28

标签: wpf

有人知道如何实现一个双击事件处理程序,以新窗口成为最前面窗口的方式打开一个新窗口吗? (只是通常预期的行为)。

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

1 个答案:

答案 0 :(得分:4)

MouseDoubleClick 事件后,会引发 MouseUp 事件,并在MainWindow上处理。因此,辅助窗口会立即激活,随后事件冒泡,主窗口会被激活。

如果您不想要,可以通过在鼠标加倍后将 e.Handled 设置为 True 来明确停止事件冒泡点击事件。这样,辅助窗口将保持激活状态。

private void doubleClick(object sender, MouseButtonEventArgs e)
{
    openNewWindow();
    e.Handled = true;
}