2012-03-24 14 views
6

Używam ShowDialog() z WindowStyle = WindowStyle.SingleBorderWindow;, aby otworzyć okno modalne w mojej aplikacji WPF (MVVM), ale pozwala mi to przejść do okna nadrzędnego za pomocą paska zadań systemu Windows (Windows 7).ShowDialog() za oknem nadrzędnym

Znalazłem odpowiedź tutaj: WPF and ShowDialog(), ale nie jest odpowiedni dla mnie, ponieważ nie potrzebuję okna narzędzia "zawsze na wierzchu".

góry dzięki

Odpowiedz

9

Spróbuj ustawić właściwość okna Owner. To powinno działać.

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

Edit: miałem podobny problem przy użyciu tej z MVVM. Możesz rozwiązać ten problem, używając delegatów.

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 
    } 
} 
+0

Dziękuję, pomysł jest dobry. Jedynym problemem w tym momencie jest to, że w ViewModelu nie mam informacji o widoku. Próbowałem 'App.Current.MainWindow' i działa, ale nie najładniejsze rozwiązanie. Może powinienem ponownie rozważyć strukturę mojego wzorca MVVM. – Oszkar

+1

Dodałem możliwe rozwiązanie dla problemu MVVM. – MatthiasG

+0

@Oszkar Użyłem 'Application.Current.MainWindow' (Aplikacja zamiast aplikacji), a ponieważ jest statyczne - domyślam się - działało dobrze bez niepokoju MVVM. – heltonbiker

1

Gdy okno nadrzędne tworzy (i pokazuje) okno potomne, tam należy ustawić właściciela.

public partial class MainWindow : Window 
{ 

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

Aditionally, jeśli nie chcesz dodatkowy pasek zadań dla wszystkich dzieci ... potem

<Window x:Class="ChildWindow"   
     ShowInTaskbar="False" > 
</Window> 
+0

Co zrobić, jeśli "ten" nie jest oknem? Używam WPF z MFC, więc nie mam aplikacji ani głównego okna. –

+0

Co próbujesz otworzyć? Wystarczy wyświetlić okno dialogowe? Jeśli nie próbujesz dołączyć okna dialogowego do okna, nie rozumiem Twojego pytania. – 00jt

+0

Jak już powiedziałem, "z MFC" ... Klasy MFC nie pochodzą od okna WPF. Niedawno odkryłem WindowInteropHelper.Owner ... chociaż nawet z tym kończymy z ukrytymi dialogami modalnymi. –

2

miałem ten problem, ale jak okno było otwierane z widoku modelu Nie miałem nie ma odniesienia do bieżącego okna. Aby obejść to użyłem tego kodu:

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

Można użyć: myWindow.Owner = Application.Current.MainWindow;

Jednak ta metoda powoduje problemy, jeśli masz trzy otwarte okna tak:

MainWindow 
    | 
    -----> ChildWindow1 

       | 
       -----> ChildWindow2 

następnie ustawienie ChildWindow2 .Owner = Application.Current.MainWindow ustawi właściciela okna jako okno główne, a nie okno nadrzędne.

0

Nawet jeśli ten post jest nieco stary, mam nadzieję, że mogę napisać moje rozwiązanie. Wszystkie powyższe wyniki są mi znane i nie przyniosły dokładnie pożądanego rezultatu.

Robię go dla innych Googlersami :)

Powiedzmy F2 to okno, które chcesz wyświetlać na górze F1:

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

to wszystko, obiecuję, że nie zniknie !

HTH Guy

0

Dużo przyczyny wzorca MVVM jest tak, że logika interakcji mogą być testowane urządzenie. Z tego powodu nie powinieneś nigdy bezpośrednio otwierać okna z ViewModel, ponieważ w trakcie testów jednostek będziesz miał okna dialogowe.

Zamiast tego należy podnieść zdarzenie, które obejmie widok i otworzyć okno dialogowe.Na przykład zobacz ten artykuł na temat żądań interakcji: https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12

Powiązane problemy