ShowDialog () за родительским окном - PullRequest
6 голосов
/ 25 марта 2012

Я использую ShowDialog() с WindowStyle = WindowStyle.SingleBorderWindow;, чтобы открыть модальное окно в моем приложении WPF (MVVM), но оно позволяет мне перейти к родительскому окну с помощью панели задач Windows (Windows 7).

IЯ нашел ответ здесь: WPF и ShowDialog () , но он мне не подходит, потому что мне не нужно окно инструмента "всегда сверху".

Заранее спасибо

Ответы [ 6 ]

10 голосов
/ 25 марта 2012

Попробуйте установить свойство Owner в диалоговом окне.Это должно работать.

Window dialog = new Window();
dialog.Owner = mainWindow;
dialog.ShowDialog();

Редактировать: У меня была похожая проблема при использовании этого с MVVM.Вы можете решить это с помощью делегатов.

public class MainWindowViewModel
{
    public delegate void ShowDialogDelegate(string message);
    public ShowDialogDelegate ShowDialogCallback;

    public void Action()
    {
        // here you want to show the dialog
        ShowDialogDelegate callback = ShowDialogCallback;
        if(callback != null)
        {
            callback("Message");
        }
    }
}

public class MainWindow
{
    public MainWindow()
    {
        // initialize the ViewModel
        MainWindowViewModel viewModel = new MainWindowViewModel();
        viewModel.ShowDialogCallback += ShowDialog;
        DataContext = viewModel;
    }

    private void ShowDialog(string message)
    {
        // show the dialog
    }
}
2 голосов
/ 07 марта 2014

У меня была эта проблема, но поскольку окно открывалось из модели представления, у меня не было ссылки на текущее окно. Чтобы обойти это, я использовал этот код:

var myWindow = new MyWindowType();
myWindow.Owner = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);

Вы можете использовать: myWindow.Owner = Application.Current.MainWindow;

Однако этот метод вызывает проблемы, если у вас открыто три окна, например:

MainWindow
   |
   -----> ChildWindow1

               |
               ----->  ChildWindow2

Затем установка ChildWindow2.Owner = Application.Current.MainWindow установит, что владельцем окна будет его родительское окно, а не родительское окно.

1 голос
/ 06 апреля 2012

Когда родительское окно создает (и показывает) дочернее окно, именно здесь вам нужно установить владельца.

public partial class MainWindow : Window
{

    private void openChild()
    {
        ChildWindow child = new ChildWindow ();
        child.Owner = this; // "this" is the parent
        child.ShowDialog();
    }
 }

Кроме того, если вам не нужна дополнительная панель задач для всех детей ... тогда

<Window x:Class="ChildWindow"           
        ShowInTaskbar="False" >
</Window>
0 голосов
/ 03 мая 2016

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

Вместо этого вы должны вызвать событие, которое View будет обрабатывать, и открыть для вас диалоговое окно. Например, см. Эту статью о запросах взаимодействия: https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12

0 голосов
/ 15 июля 2015

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

Я делаю это для других googlers:)

Допустим, f2 - это ваше окно, которое вы хотите отобразить поверх f1:

f2.Owner = Window.GetWindow(this);
f2.ShowDialog();

Вот и все, обещаю, оно не исчезнет!

НТН Guy

0 голосов
/ 25 марта 2012

Добавьте «ShowInTaskbar» и установите для него значение false.

...