2009-02-23 12 views
9

używam funkcji splasha w WPF ustawiając bitmapę za Konstruowanie Akcja się ekran powitalny. Za ekranem powitalnym sprawdzane są informacje dotyczące licencji, a jeśli się nie uda, wyświetlam komunikat: MessageBox.jak ustawić wpf MessageBox.Owner do okna pulpitu, ponieważ ekran powitalny zamyka MessageBox

Zgodnie z tym Feedback, ponieważ MessageBox.Owner jest ekranem powitalnym i tak szybko, jak inne okno jest otwarte, nawet jeśli jest to MessageBox, okno z ekranem powitalnym jest zamknięte, co z kolei zamyka MessageBox, więc użytkownik nigdy nie widzi wiadomości MessageBox.

Rozwiązaniem problemu byłoby ustawienie MessageBox.Owner na inne okno, ale to oznaczałoby, że muszę utworzyć instancję innego okna, które może nie być nawet potrzebne.

Czy byłoby możliwe ustawienie MessageBox.Owner na okno pulpitu? I jak, ponieważ jedyną inną funkcją, która przychodzi na myśl, jest funkcja api GetDesktopWindow(), ale zwraca ona uchwyt okna, a MessageBox.Owner jest oknem WPF.

Odpowiedz

1

Czy możesz dodać kod? Po prostu próbowałem to dodanie do pliku App.xaml.cs w nowej aplikacji WPF:

protected override void OnStartup(StartupEventArgs e) 
{ 
    if (MessageBox.Show("Start app?", "Confirm Start", 
     MessageBoxButton.YesNo) == MessageBoxResult.No) 
    { 
     this.Shutdown(); 
     return; 
    } 

    this.StartupUri = new Uri("Window1.xaml", UriKind.Relative); 
    base.OnStartup(e); 
} 

... i działa zgodnie z oczekiwaniami („Potwierdź Start” szybkich pozostaje otwarty aż już odpowiedział mi, i jeśli kliknę "Nie", aplikacja zostanie wyłączona).

+0

Matt, ja też testowałem to jak ty i sobie sprawę, że działa, bo używałem ekran powitalny, zamyka MessageBox, bez ekranu powitalnego nie zamknąć – adriaanp

+0

Więc myślę, że teraz trzeba zdecydować, czy zamknąć pytanie jako "już nie istotne", czy (jak sugeruje @adriaanp w swoim komentarzu) przerobić to na inne pytanie. –

0

to pomogło mi wiele ..... dał mi nowy pomysł ale przykład kod, który widziałem tutaj ma pewne modyfikacje wymagane

Oto prosty przykład w WPF z modyfikacją teraz pracuje

przycisk kliknij

wkleić kod

jeśli (System.Windows.Forms.MessageBox.Show ("jesteś pewien", "usuń", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System .Windows.Forms.DialogResult.Yes) { this.Close(); } else { MessageBox.Pokaż ("dlaczego nie usuwać"); }

9

Ponieważ za pomocą okna na pulpicie jako rodzic dla modalnych okien dialogowych nie jest dobrym pomysłem, ponieważ @Nir podkreślił w swojej odpowiedzi, oto trzy inne obejścia:

1) używać ukrytego okna. Stwórz małe, niemodalne okno, aby działać jako rodzic dla twojego MessageBox lub innego modalnego okna dialogowego. Takie podejście jest opisane tutaj:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/

2) Tworzenie non-modalnych okien komunikatów. Zmień tryb uruchamiania na jawne wyłączenie i użyj niemodalnego okna do wyświetlenia wiadomości. Takie podejście jest opisane w odpowiedzi na to pytanie StackOverflow:

MessageBox with exception details immediately disappears if use splash screen in WPF 4.0

3) Zadzwoń MessageBox dwukrotnie. Wygląda na to, że problem dotyczy tylko pierwszego pokazanego modalnego okna dialogowego. Możesz więc dwukrotnie wywołać dialog modalny, jeśli nie masz nic przeciwko błyskowi pierwszego otwarcia i zamknięcia.

https://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

Osobiście nie lubię żadnego z tych obejścia. Jedyną opcją jest uniknięcie wbudowanej funkcjonalności SplashScreen i samodzielne rozwijanie od podstaw. Oto link, jeśli chcesz zbadać tą drogą dalej:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/

Wreszcie, jeśli jesteś jak zirytowany ten problem jak ja, można głosować na Microsoft, aby naprawić ten błąd tutaj:

http://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

8

wymyśliłem tego rozwiązania siebie, więc może coś jest nie tak, ale wydaje się, że doskonale działa:

Window temp = new Window() { Visibility=Visibility.Hidden }; 
temp.Show(); 
MessageBox.Show(temp, "An error occurred before the application could start.\n\nTechnical Details: " + ex.Message, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Stop); 
App.Current.Shutdown(1); 
+2

Ładne i proste obejście problemu. Jednak "Visibility = Visibility.Hidden" nie jest tak naprawdę potrzebna, ponieważ i tak zamierzasz pokazać okno. Zamiast tego, aby uniknąć wyświetlania splash w oknie tła, użyłem: 'new Window {WindowState = WindowState.Minimized, ShowInTaskbar = false}' – splintor

+0

'new Window {AllowsTransparency = true, ShowInTaskbar = false, WindowStyle = WindowStyle.None , Background = Brushes.Transparent} 'może sprawić, że okno będzie całkowicie ukryte podczas ustawiania widoczności lub stanu okna spowoduje, że okno będzie wyświetlane przez kilka milisekund po wywołaniu' Show() '. – kiran

0

Nie jest to bezpośrednio związane z sytuacją PO, ale może być użyteczne dla innych, którzy mają problemy z ukrywaniem się MessageBox za innymi oknami w pewnych szczególnych sytuacjach.

Jak wspomina @dthrasher, jednym rozwiązaniem jest użycie ukrytego okna manekina. Ale czasami nawet to nie wystarczy. Miałem sytuację, w której rozwiązaniem było nie tylko użycie ukrytego okna manekina, ale włączenie jego właściwości TopMost za każdym razem, gdy używałam jej z MessageBox.

 _formKludge.TopMost = true; 

    MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program", 
        MessageBoxButtons.OK, MessageBoxIcon.Error); 

    _formKludge.TopMost = false; 
Powiązane problemy