Как сделать так, чтобы всплывающие окна WPF не скрывались за основным приложением? - PullRequest
2 голосов
/ 18 сентября 2009

В приложении WPF у меня есть кнопки, которые выскакивают экземпляры окон.

  • Я нажимаю первую кнопку, и первое окно корректно появляется в перед основного приложения.
  • Я нажимаю вторую кнопку, и второе окно корректно появляется в front основного приложения. Однако, первое окно теперь перемещается позади основного приложения. Это сбивает с толку и неожиданно, поскольку оно часто находится в середине основного приложения, и, таким образом, кажется, что оно исчезает , пока пользователь не переместит основное приложение, чтобы найти его скрывающимся.

alt text

Это XAML :

<Window x:Class="TestPopupFix.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="600" Width="800">
    <StackPanel>
        <Button Content="Open first popup" Click="Button_OpenFirst"/>
        <Button Content="Open second popup" Click="Button_OpenSecond"/>
    </StackPanel>
</Window>

И этот код позади :

private void Button_OpenFirst(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    TextBlock tb = new TextBlock();
    tb.Text = "This is the first window.";
    window.Content = tb;
    window.Width = 300;
    window.Height = 300;
    window.Show();
}

private void Button_OpenSecond(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    TextBlock tb = new TextBlock();
    tb.Text = "This is the second window.";
    window.Content = tb;
    window.Width = 300;
    window.Height = 300;
    window.Show();
}

Что мне нужно сделать, чтобы основное приложение оставалось дальше назад, когда я открываю новые окна?

Ответы [ 2 ]

12 голосов
/ 18 сентября 2009

Чтобы упорядочить окна в визуальной иерархии, необходимо установить свойство Owner дочернего окна в родительское окно.

Подробнее о свойстве Owner можно прочитать на сайте MSDN .

Вы должны изменить свой код на что-то похожее на это:

Window parentWindow;

private void Button_OpenFirst(object sender, RoutedEventArgs e)
{
  this.parentWindow = new Window();
  this.parentWindow.Owner = this;
  this.parentWindow.Show();
}

private void Button_OpenSecond(object sender, RoutedEventArgs e)
{
  Window childWindow = new Window();
  childWindow.Owner = this.parentWindow;
  childWindow.Show();
}
6 голосов
/ 14 ноября 2012

У меня была такая же проблема, но хостинг окна WPF в форме WinForms. В этой ситуации установка хозяина дала мне часть пути, но иногда это все еще отставало.

В дополнение к этому я в итоге подключил событие Loaded в окне WPF и вызвал Activate следующим образом:

_window.Loaded += (s, e) => _window.Activate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...