Владелец окна в WPF без постоянного поведения - PullRequest
12 голосов
/ 28 марта 2011

Можно ли получить некоторые функции Window.Owner, не получив всего этого?

Есть два окна, окно A и окно B. Я хочу сделать так, чтобы выбор одного из них приводил их поверх других приложений, но любое из них могло перекрывать другое. (В действительности их больше двух, но все они должны вести себя одинаково.)

Если я установлю для окна B Owner значение A, то переключение на любое из окон приведет к тому, что оба приложения окажутся перед другими приложениями (которые мне нужны), но также заставит B всегда находиться над A (что я не делаю). не хочу).

На самом деле у меня уже есть код, который отслеживает иерархию окон независимо от Owner / OwnedWindows, поэтому я, вероятно, могу расширить его, чтобы решить проблему активации. Так что, если это упрощает проблему, я ищу альтернативный ответ:

Как мне на самом деле «когда это окно активируется пользователем, перенести определенный набор окон (все остальные в приложении) в Z-порядок чуть ниже меня, сохраняя при этом их существующие Z-порядки относительно друг друга "?

1 Ответ

4 голосов
/ 08 апреля 2011

Одним из возможных решений было бы иметь скрытое окно, которое владеет всеми окнами в вашем приложении.

Вы бы объявили его примерно так:

<Window
    Opacity="0"
    ShowInTaskbar="False"
    AllowsTransparency="true"
    WindowStyle="None">

Обязательно удалите StartupUri изваше приложение. xaml.А в вашем App.xaml.cs вы переопределите OnStartup, чтобы он выглядел примерно так:

protected override void OnStartup(StartupEventArgs e)
{
    HiddenMainWindow window = new HiddenMainWindow();
    window.Show();

    Window1 one = new Window1();
    one.Owner = window;
    one.Show();

    Window2 two = new Window2();
    two.Owner = window;
    two.Show();
}

Еще одна сложность заключается в том, как вы хотите обработать закрытие реального приложения.Если одно из этих окон считается MainWindow, вы можете просто изменить приложение ShutdownMode на ShutdownMode.OnMainWindowClose, а затем установить свойство MainWindow для любого из этих окон.В противном случае вам нужно будет определить, когда все окна закрыты, и явно вызвать Shutdown.

...