come impostare wpf MessageBox.Proprietario finestra sul desktop perché lo SplashScreen chiude MessageBox

StackOverflow https://stackoverflow.com/questions/576503

  •  05-09-2019
  •  | 
  •  

Domanda

Io sto usando il SplashScreen in WPF, impostando una bitmap Costruire L'Azione per lo Splashscreen.Dietro la schermata iniziale, le informazioni di licenza è controllare, e se non mi mostra un MessageBox.

In base a questo Feedback, è perché il MessageBox.Il proprietario è lo splash screen e non appena un'altra finestra è aperta, anche se è un MessageBox lo splash screen della finestra è chiusa, che poi chiude la MessageBox, in modo che l'utente non vede mai il MessageBox.

La soluzione sarebbe quella di impostare il MessageBox.Proprietario di un'altra finestra, ma che vorrebbe dire che devo creare un'istanza di un'altra finestra, che potrebbe anche non essere necessaria.

Sarebbe possibile impostare la MessageBox.Proprietario per la finestra del desktop?E come, perché l'unica altra funzione che viene in mente è il GetDesktopWindow() funzione api, ma che restituisce un handle di finestra e MessageBox.Il proprietario è una Finestra WPF.

È stato utile?

Soluzione 3

Ho trovato il problema. Sono anche utilizzando la schermata iniziale build-in che causa questo: WPF SplashScreen chiude MessageBox

Altri suggerimenti

Dal momento che utilizzando la finestra del desktop, come il genitore per le finestre di dialogo modale non è una buona idea, come @Nir ha sottolineato nella sua risposta, qui altre tre soluzioni alternative:

1) Utilizzare una finestra nascosta. Creare una piccola finestra non modale di agire come il genitore per il MessageBox o altro finestra di dialogo modale. Questo approccio è descritto qui:

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

2) Creazione di finestre di messaggio non-modali. Cambia la modalità di avvio per spegnere esplicito e utilizzare una finestra non modale per visualizzare il messaggio. Questo approccio è descritto nella risposta a questa domanda StackOverflow:

MessageBox con i dettagli di eccezione scompare immediatamente se utilizzare splash screen in WPF 4.0

3) Chiamare MessageBox due volte. A quanto pare, il problema riguarda solo la prima finestra di dialogo modale mostrato. Così si potrebbe semplicemente chiamare la tua finestra di dialogo modale due volte, se non ti dispiace il flash della prima apertura e la chiusura.

https: // connettersi .microsoft.com / VisualStudio / feedback / dettagli / 600197 / WPF-splash-screen-Rigetta-finestra-box

Personalmente, non mi piace nessuna di queste soluzioni alternative. L'unica altra opzione è quella di evitare la funzionalità SplashScreen incorporato e di rotolare il proprio da zero. Ecco un link se si vuole approfondire questa strada:

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

Infine, se siete come infastidito da questo problema come lo sono io, si può votare per Microsoft per risolvere questo bug qui:

http: // connettersi .microsoft.com / VisualStudio / feedback / dettagli / 600197 / WPF-splash-screen-Rigetta-finestra-box

Sono venuto con questa soluzione me stesso, quindi forse c'è qualcosa di sbagliato con esso, ma sembra funzionare perfettamente:

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);

Puoi pubblicare un certo codice? Ho appena provato ad aggiungere questo al file App.xaml.cs in una nuova applicazione 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);
}

... e funziona come previsto (il prompt "Conferma Start" rimane aperto fino a quando ho risposto, e se faccio clic su "No" l'applicazione si spegne).

La finestra del desktop non è mai il genitore corretto, leggere questo sapere perché:

http://blogs.msdn.com/oldnewthing /archive/2004/02/24/79212.aspx

Ora il problema descritto in questo post non avviene tanto perché MS ha lavorato intorno ad esso, in questo post si può vedere come:

http://blogs.msdn.com/oldnewthing /archive/2006/11/02/931674.aspx

questo mi ha aiutato un sacco .....Mi ha dato nuova idea ma il codice di esempio che ho visto qui è alcune richieste di modifica

ecco un semplice esempio in wpf, con modificazioni, ora si sta lavorando

fare clic sul pulsante

incolla questo codice

se (System.Windows.Le forme.MessageBox.Mostra("are u sicuro", "elimina", il Sistema.Windows.Le forme.MessageBoxButtons.Sìno, Sistema.Windows.Le forme.MessageBoxIcon.Domanda) == System.Windows.Le forme.DialogResult.Sì) { questo.Close();} altro { MessageBox.Mostra("perché non eliminare");}

Questo non è direttamente correlata alla situazione del PO, ma potrebbe essere utile per gli altri che stanno avendo problemi con MessageBox essere nascosti dietro altre finestre in certe situazioni particolari.

Come @dthrasher menzioni, una soluzione è quella di utilizzare una finestra fittizio nascosta. Ma a volte anche questo non è sufficiente. Ho avuto una situazione in cui la soluzione era quella di utilizzare non solo una finestra fittizio nascosta, ma per accendere la sua proprietà TopMost ogni volta che ho usato con MessageBox.

     _formKludge.TopMost = true;

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

     _formKludge.TopMost = false;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top