WPF Создать одноуровневое окно и закрыть текущее - PullRequest
3 голосов
/ 13 июля 2011

Мне нужен такой обработчик событий в моем классе окна.

void someEventHandler(object sender, RoutedEventArgs e)
{
    MyNewWindow mnw = new MyNewWindow();
    mnw.Owner = Window.GetWindow(this);
    mnw.ShowDialog();
    this.Close();
}

Window.GetWindow (this) возвращает родительское окно текущего окна.

Я думал, когдавладелец нового окна является родительским окном текущего, он будет ждать родителя;а не текущий.Но это не сработало.Текущее окно ожидает выполнения нового и закрывается только после.

Если я по какой-то причине использую Show () вместо ShowDialog (), то окно вообще не отображается.

Возможно, янужны некоторые методы делегата, но я не уверен, с чего начать.

Редактировать: Я думаю, мне нужно улучшить вопрос для будущих ссылок: новое окно должно быть диалогом с родительским окном.Если я использую Show (), родительское окно становится доступным, и я не хочу этого.Если я использую ShowDialog (), он становится диалогом с текущим окном, что означает, что текущее окно не закрывается, пока не закроется новое окно, и я тоже этого не хочу.

Ответы [ 3 ]

5 голосов
/ 13 июля 2011

Закрытие окна приводит к закрытию всех принадлежащих ему окон .

Если вы просто хотите, чтобы окно владельца не было видно, попробуйте это;

void someEventHandler(object sender, RoutedEventArgs e)
{
    MyNewWindow mnw = new MyNewWindow();
    mnw.Owner = this;
    this.Hide(); // not required if using the child events below
    mnw.ShowDialog();
}

Вероятно, вы захотите подключить какое-то событие в родительском окне, которое будет действовать соответствующим образом при закрытии дочернего окна в зависимости от ваших требований.

РЕДАКТИРОВАТЬ

Вывозможно, может контролировать сокрытие (нескольких родителей) от ребенка;

void OnLoad(object sender, RoutedEventArgs e)
{
  this.Owner.Hide();
}
void Closed(object sender, RoutedEventArgs e)
{
  this.Owner.Show();
}
1 голос
/ 13 июля 2011

Вызов ShowDialog() блоков.Это означает, что метод возвращается только тогда, когда mnw закрывается, и только тогда закрывается исходное окно.

Если вы измените его на Show(), mnw закроется, как только вы вызовете Close()на оригинальном окне.потому что Window.GetWindow(this) возвращает this.Таким образом, вы устанавливаете владельца на this, а когда вы закрываете this, mnw тоже закрывается.Это оставляет нас с:

MyNewWindow mnw = new MyNewWindow();
mnw.Owner = this.Owner; // may not be necessary
mnw.Show();
this.Close();

Этот код, кажется, работает для меня.

1 голос
/ 13 июля 2011

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

Для этого вы должны использовать:

    mnw.Owner = this.Owner;

вместо вызова GetWindow, что возвращает вам текущий экземпляр Window.Цель GetWindow - получить окно, которое содержит некоторый другой элемент UIElement, например, кнопку, расположенную ниже по дереву.Передавая экземпляр Window, вы просто возвращаете то, что передали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...