74 Stimmen

Wie ein WPF-Fenster über alle anderen Fenster meiner Anwendung (nicht systemweit) sein?

Ich möchte, dass mein Fenster über allen anderen Fenstern angezeigt wird. nur bei meiner Bewerbung . Wenn ich die TopMost-Eigenschaft eines Fensters einstelle, wird es über allen Fenstern aller Anwendungen angezeigt, und das möchte ich nicht.

0 Stimmen

Übrigens kann ich für dieses Fenster keinen Eigentümer festlegen, da dieses Fenster vor allen anderen Fenstern erstellt wird (es ist der Startbildschirm der Anwendung). Ref: stackoverflow.com/questions/2463149/

0 Stimmen

Auch wenn die Frage schon etwas älter ist, muss ich doch diese Anmerkung machen... Ihre Frage und der Kommentar sind ziemlich seltsam, Sie wollen Ihr Fenster oben in Ihrer Anwendung haben, aber in Ihrem Kommentar geben Sie an, dass keine Anwendung läuft, da es das erste Fenster (Startbildschirm) ist, also wie kann Ihr Fenster oben auf einer nicht vorhandenen Anwendung sein?!? Ich frage mich, wie um alles in der Welt diese Frage 16 positive Bewertungen erhalten konnte.

1 Stimmen

Wenn die App startet, gibt es kein anderes Fenster, sondern das Hauptfenster erscheint kurz danach und muss hinter dem Startbildschirm bleiben, bis alles geladen ist.

1voto

Juan Campa Punkte 11

So geht's: Lassen Sie Ihr "oberstes" Fenster die anderen Windows-Ereignisse "GotFocus" und "LostFocus" abonnieren und verwenden Sie die folgenden Ereignis-Handler:

class TopMostWindow
{
    void OtherWindow_LostFocus(object sender, EventArgs e)
    {
        this.Topmost = false;
    }

    void OtherWindow_GotFocus(object sender, EventArgs e)
    {
        this.Topmost = true;
    }
}

0voto

Glenn Slayden Punkte 15791

Dies ist meine zweite Antwort auf die Frage; ich habe eine weitere sehr wirksame Technik für das Management mehrerer Window Instanzen, die zu einer einzigen Application

Wie viele festgestellt haben, ist die Window.Owner Eigentum ist der Schlüssel. Immer wenn Ihre Anwendung aktiv ist, d. h. eine der Windows IsActive --Sie wollen die Owner Eigenschaft aller Ihrer Fenster zu sein null . Dies ermöglicht einen gleichmäßigen Wechsel zwischen den verschiedenen Fenstern in Ihrer Anwendung.

Aber wenn Ihre App pas aktiv ist, wollen Sie die Window.Owner Eigenschaft für jede Ihrer nicht MainWindow Fenster, die auf Ihr MainWindow . Auf diese Weise können Sie ein beliebiges Fenster Ihrer Anwendung zur Reaktivierung verwenden, und alle Fenster Ihrer Anwendung werden wiederhergestellt vor allen anderen Anwendungen .

Schalten Sie bei jeder erneuten Aktivierung der App den Window.Owner Werte zurück zu null . die Application.OnActivated y Application.OnDeactivated Methoden sind dafür perfekt geeignet.

Sie müssen eine separate Liste aller Ihrer Fenster führen, da Sie bei dieser Umgehungslösung nicht den Komfort der Funktion Window.OwnedWindows Eigentum an Ihrem MainWindow wenn es an der Zeit ist, diese Einstellungen vorzunehmen.

public partial class MyApp : Application
{
    // not shown: keep this list of all your non-main windows updated...
    public List<Window> rgw = new List<Window>();

    protected override void OnActivated(EventArgs e)
    {
        // when app is ACTIVE, set all `Owner` values to null...
        rgw.ForEach(w => w.Owner = null);

        base.OnActivated(e);
    }

    protected override void OnDeactivated(EventArgs e)
    {
        // set `Owner` on all non-main Windows only when not-active
        rgw.ForEach(w => w.Owner = Current.MainWindow);  

        base.OnDeactivated(e);
    }

    // etc..
}

0voto

paradisonoir Punkte 2842

Sie können dies zu Ihren Windows-Tags hinzufügen

WindowStartupLocation="CenterScreen"

Dann können Sie sie auch anzeigen, wenn Sie möchten, dass Ihre Benutzer sie bestätigen, um fortzufahren

YourWindow.ShowDialog();

Probieren Sie es zunächst ohne TopMost-Parameter und sehen Sie sich die Ergebnisse an.

1 Stimmen

Ich möchte kein modales Fenster haben. Nur ein Fenster der obersten Ebene.

0 Stimmen

Warum also nicht einfach die Option WindowStartupLocation="CenterScreen" verwenden?

2 Stimmen

Denn wenn der Benutzer auf ein anderes Fenster klickt, das sich dahinter befindet, bleibt es nicht im Vordergrund. Ich möchte, dass es immer oben ist, aber ich möchte nicht, dass es die anderen Fenster blockiert (das ist, was modale tun).

0voto

Fernando Santiago Punkte 1960

Das ist es, was mir geholfen hat:

Window selector = new Window ();
selector.Show();
selector.Activate();
selector.Topmost = true;

0voto

Chaya Sulman Punkte 111

Ich lief gerade in das gleiche Problem und fand Probleme, die den Besitzer mit MVVM ohne die App in der Produktion zum Absturz zu bringen. Ich habe ein Fenster-Manager-Ansicht-Modell, das einen Befehl zum Öffnen eines Fensters mit der Uri des Fensters enthält - und ich war nicht in der Lage, den Besitzer zu App.MainWindow ohne die App Absturz zu setzen.

Also - Anstatt den Eigentümer zu setzen, habe ich die TopMost-Eigenschaft des Fensters an eine Eigenschaft in meinem Window Manager View-Modell gebunden, die angibt, ob die Anwendung gerade aktiv ist. Wenn die Anwendung aktiv ist, befindet sich das Fenster oben, wie ich es möchte. Wenn es nicht aktiv ist, können andere Fenster es verdecken.

Hier ist, was ich zu meinem View Model hinzugefügt habe:

 public class WindowManagerVM : GalaSoft.MvvmLight.ViewModelBase
    {
        public WindowManagerVM()
        {
            App.Current.Activated += (s, e) => IsAppActive = true;
            App.Current.Deactivated += (s, e) => IsAppActive = false;
        }

        private bool _isAppActive = true;
        public bool IsAppActive
        {
            get => _isAppActive;
            set
            {
                if (_isAppActive != value)
                {
                    _isAppActive = value;
                    RaisePropertyChanged(() => IsAppActive);
                }
            }
        }
    }

Hier ist die XAML, die es implementiert (ich verwende MVVM light mit einem ViewModelLocator als statische Ressource in meiner App namens Locator):

<Window Topmost="{Binding WindowManager.IsAppActive, Source={StaticResource Locator}}"/>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X