【问题标题】:WPF weird window switching on double-click双击打开WPF奇怪的窗口
【发布时间】:2014-05-26 04:19:41
【问题描述】:

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

在 WPF 中,当在双击事件处理程序中打开第二个窗口时,窗口会出现奇怪的行为。第二个窗口打开,但第一个窗口(触发双击事件的位置)立即再次激活。 在单击事件处理程序中打开一个窗口,按预期工作。第二个窗口打开并保持为前窗口。

出于演示目的,我创建了以下应用程序。两个窗口类,只有一个按钮控件。为了区分按钮控件的单击和双击,单击事件仅在按下左 shift 键时才起作用。

双击后

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

    MouseDoubleClick 事件之后,MouseUp 事件会在 MainWindow 上进行处理。因此,辅助窗口会立即被激活,并且随着随后的事件冒泡,主窗口会被激活。

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

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

    【讨论】:

    • 非常感谢,有时就这么简单:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多