Finestra di Dialogo modale non mostrando in cima ad altre finestre

Sto usando Window.ShowDialog() per aprire una finestra modale nel mio WPF (MVVM) applicazione, ma non mi permette di navigare per altri windows utilizzando la barra delle applicazioni di Windows (Windows 7).

Considerare questo:
Ho 3 non-modale finestre aperte nella mia applicazione. Ora Uno di questi si apre una finestra modale utilizzando Window.ShowDialog(). Ho anche impostato Application.MainWindow come il proprietario della finestra modale. Questo è così perché sto usando MVVM di messaggistica e il gestore del messaggio per aprire una nuova finestra è centralizzato in App.xaml.cs. La finestra non si apre modale – nessun problema. Tuttavia, Windows 7 mi permette di swtich per l’altra applicazione di windows dalla barra delle applicazioni. Questo porta a una situazione in cui la finestra modale va dietro un’altra finestra, che preferisco non avere.

Io non riesco a fare nulla su altri windows finchè ho modale aperto, ma sarebbe bello se la finestra modale è rimasto sempre in alto, come a lungo è aperta. C’è un modo per disattivare la barra delle applicazioni di commutazione quando il modale è aperto? FYI – tutte le finestre aperte lanciato dall’app appaiono come voci separate sulla barra delle applicazioni.

Grazie in anticipo!

  • Si potrebbe ottenere un po ‘ di codice da cui si crea la Finestra che diventa la finestra di dialogo modale?
  • Ciò che è necessario è per la finestra al di sopra di TUTTE le altre app. Quello che mi serve è per la finestra al di sopra di ogni altra finestra nella app, come una finestra di dialogo. Per le mie esigenze, queste due righe: Proprietario = Applicazione.Corrente.MainWindow; e ShowInTaskbar = false; funziona bene. +1 per te.
InformationsquelleAutor Pratz | 2011-06-20



5 Replies
  1. 60

    Non c’è alcun codice di base di questo, ma sembra che ti hanno lasciato fuori alcune proprietà sul Window hai creato e previsto ShowDialog di applicare ulteriori “dialogo” semantica”:

    Window window = new Window()
    {
        Title = "Modal Dialog",
        ShowInTaskbar = false,               //don't show the dialog on the taskbar
        Topmost = true,                      //ensure we're Always On Top
        ResizeMode = ResizeMode.NoResize,    //remove excess caption bar buttons
        Owner = Application.Current.MainWindow,
    };
    
    window.ShowDialog();
    • Sei un salvatore sixlettervariables! Più alto era quello che mi mancava. Le scuse per non postare codice, ma si è inchiodato. Non posso credere che ho perso. Grazie ancora!
    • Per rimuovere i pulsanti di didascalia è necessario impostare la ResizeMode per NoResize invece di WindowStyle. Un ToolWindow non è un dialogo.
    • suona bene, purché non si cura di ridimensionare la finestra di dialogo.
    • Sì, questo è un buon punto, ma si possono anche usare le API Win32 per rimuovere i pulsanti di didascalia e mantenere il ridimensionamento della capacità, WPF ha ancora un po ‘ traballante cose, credo. Tutto il codice, però, quindi è sempre un modo per fare qualcosa.
    • Ma Di Sistema.Windows.Finestra.ShowDialog() non accetta alcun parametro. Perché?
    • buona pesca, aggiornati.

  2. 11

    Basta impostare il proprietario di proprietà della Finestra per la finestra chiamante. L’attivazione dell’applicazione WPF nella barra delle applicazioni non appena si attiva la nestra Principale, ma anche modale bambino finestra e la porta di fronte.

    ChildWindow C = new ChildWindow();
    C.Owner = this;
    C.ShowDialog();
  3. 10

    Impostazione Superiore a True (Primo=True) fa sì che la finestra di dialogo per essere in cima a tutte le finestre del sistema (non solo nell’applicazione).

    Quindi si può provare a registrare l’evento Attivato nella vostra finestra principale:

    Activated += WindowActivated;

    e attivare un proprietario finestra di dialogo modale ogni volta che un’altra finestra principale dell’applicazione diventa attivo.

    private void WindowActivated(object sender, EventArgs e)
    {
        Window window = Application.Current.Windows.OfType<YourMainWindow>().FirstOrDefault(p => p != this && !p.IsActive && p.OwnedWindows.Count > 0);
        if (window != null)
        {
            window.Activate();
        }
    }

    Questo semplice hack si assume tutti i tuoi figli di windows sono modali, ma si può scrivere una logica più sofisticato.

    • questo dovrebbe essere accettato risposta: sembra che l’unico modo per mantenere la finestra di dialogo sulla parte superiore della finestra principale, dopo aver attivato l’applicazione utilizzando la barra delle applicazioni. È un problema noto: connect.microsoft.com/VisualStudio/feedback/details/474480/…
    • Questo funziona meglio da code-behind della finestra stessa (con i += all’evento). Che consente la finestra principale non si cura di ciò che gli altri stanno facendo.
    • Oh, e attivando la finestra di dialogo mentre è nascosto (perché non mi piace per chiudere effettivamente fa la finestra principale inutilizzabile, quindi, un controllo del Visibile è in ordine.
  4. 3

    Ho finito per usare una combinazione di un paio di risposte qui. Accettato risposta è stata utile all’inizio, ma come altre persone qui hanno sottolineato l’impostazione Topmost = true significa che la finestra è sempre al di sopra di tutte le altre applicazioni in esecuzione. La mia soluzione è stata questa:

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

    Inizialmente ho utilizzato:

    myWindow.Owner = Application.Current.MainWindow;

    Tuttavia, questo metodo può causare problemi se si dispone di tre finestre aperte come questo:

    MainWindow
       |
       -----> ChildWindow1
    
                   |
                   ----->  ChildWindow2

    Quindi impostazione ChildWindow2.Owner = Application.Current.MainWindow imposta il proprietario della finestra per essere suo nonno finestra, non finestra padre.

    Per velocizzare le cose, l’ho aggiunto come un frammento di codice in Visual Studio. Se si aggiungono i seguenti Strumenti –> Frammento di Codice Manager –> il Mio Snippet di Codice:

    <CodeSnippets
        xmlns="http://schemas.microsoft.com/VisualStudio/2010/CodeSnippet">
      <CodeSnippet Format="1.0.0">
        <Header>
          <Title>MVVM Set owner of page to be current active window</Title>
          <Shortcut>owner</Shortcut>
        </Header>
        <Snippet>
          <Code Language="CSharp">
            <![CDATA[System.Windows.Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);]]>
          </Code>
        </Snippet>
      </CodeSnippet>
    </CodeSnippets>

    Digitando ‘proprietario’ e il doppio toccando il tasto tab aggiunge il ‘Application.CurrentWindows...‘ parte automaticamente.

    • questo ha salvato la mia vita, perché ho impostate tutte le opzioni, citato da tutti, ma non si è mai guardato cosa mainwindow potrebbe essere. la tua risposta mi ha portato a guardare in quel
  5. 1

    Dovuto fare un po ‘ di modifiche.
    Ho dovuto impostare il proprietario e attivare la finestra.
    Controllare la finestra pop-up e attivare la finestra, come indicato di seguito.

            var enumerator = Application.Current.Windows.GetEnumerator();
            while (enumerator.MoveNext())
            {
                Window window = (Window)enumerator.Current;
                if (window != null && window.GetType() == typeof(PopUpWindow))
                {
                    window.Activate();
                }
            }

Lascia un commento