Thomy
Thomy

Reputation: 53

WPF weird window switching on double-click

Does anybody know how to implement a double-click event handler that opens a new window in a way the new window becomes the front most window? (Just the behavior that is normally expected).

In WPF there is a strange behavior of windows when opening a second window in the double-click event handler. The second window opens but the first window, where the double-click-event was fired, becomes activated again immediately. Opening a window in a click event handler, works as expected. The second window opens and remains the front window.

For demonstration purposes I created the following application. Two window classes with just a button control. To distinguish between click and double-click on the button control, the click-event works only if the left shift key is pressed.

After double-click

http://blog.mutter.ch/wp-content/uploads/2014/05/wpf_window1.png

After click (this is also the expected behavior for double-click)

http://blog.mutter.ch/wp-content/uploads/2014/05/wpf_window2.png

Main Window

<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>

The code behind:

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

Second Window

<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>

The code behind:

public partial class SecondWindow : Window
{
    public SecondWindow()
    {
        InitializeComponent();
    }

    private void click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
}

Upvotes: 2

Views: 1203

Answers (1)

Rohit Vats
Rohit Vats

Reputation: 81253

After MouseDoubleClick event, MouseUp event is raised which gets handled on MainWindow. Hence secondary window gets activated momentarily and with subsequent event bubbling, main window gets activated.

In case you don't want that, you can explicitly stop event bubbling by setting e.Handled to True after mouse double click event. This way secondary window will remain activated.

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

Upvotes: 5

Related Questions