So legen Sie die Position von Dialog fest, von der aus .ShowDialog();
sie in der Mitte des Hauptfensters angezeigt wird.
Auf diese Weise versuche ich, die Position festzulegen.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
PresentationSource source = PresentationSource.FromVisual(this);
if (source != null)
{
Left = ??
Top = ??
}
}
In der zum Dialog gehörenden XAML:
und in C #, wenn Sie den Dialog instanziieren:
quelle
var dlg = new MyDlg { Owner = this };
auf dem zweiten Bit tun .dlg.Owner = Application.Current.MainWindow;
Ich denke, es ist einfacher, XAML-Markup zu verwenden
quelle
CenterParent
oderCenterOwner
? Ich sehe nurCenterOwner
in IntellisenseNur im Code dahinter.
quelle
Ich denke, die Antworten aller auf diese Frage sind Teile dessen, was die Antwort sein sollte. Ich werde sie einfach zusammenstellen, was meiner Meinung nach der einfachste und eleganteste Ansatz für dieses Problem ist.
Erstes Setup, in dem sich das Fenster befinden soll. Hier ist es der Besitzer.
Bevor wir das Fenster öffnen, müssen wir es dem Eigentümer geben und von einem anderen Beitrag aus können wir mit dem statischen Getter für das MainWindow der aktuellen Anwendung auf das MainWindow zugreifen.
Das ist es.
quelle
Ich fand das am besten
quelle
Wenn Sie wenig Kontrolle über die Fenster haben, die Sie anzeigen müssen, kann das folgende Snippet hilfreich sein
quelle
Um ein WPF-Dialogfeld in der Mitte eines übergeordneten Windows Forms-Formulars zu positionieren, habe ich das übergeordnete Formular an das Dialogfeld übergeben, da Application.Current das übergeordnete Windows Form-Formular nicht zurückgegeben hat (ich gehe davon aus, dass es nur funktioniert, wenn die übergeordnete App WPF ist).
Legen Sie die WindowStartupLocation im WPF-Dialogfeld fest:
Die Art und Weise, wie Windows Form den WPF-Dialog lädt, sieht folgendermaßen aus:
quelle
Sie müssen ein übergeordnetes Fenster für Ihr Fenster (Eigentümer) festlegen und dann die WindowStartupLocation-Eigenschaft auf "CenterParent" setzen.
quelle
Ich möchte der Antwort von Fredrik Hedblad hinzufügen, dass das Ergebnis falsch wäre, wenn die Größe des MainWindows geändert oder maximiert worden wäre, da mainWindow.Width und mainWindow.Height den in der XAML festgelegten Wert widerspiegeln.
Wenn Sie die tatsächlichen Werte möchten, können Sie mainWindow.ActualWidth und mainWindow.ActualHeight verwenden:
quelle
XAML:
quelle
Dieser Code funktioniert, wenn Sie die WindowStartupLocation-Eigenschaft in xaml nicht verwenden möchten:
Ich verwende "screen.WorkingArea", weil die Taskleiste das mainWindow kleiner macht. Wenn Sie das Fenster in der Mitte des Bildschirms platzieren möchten, können Sie stattdessen "screen.Bounds" verwenden.
quelle
Stellen Sie für das untergeordnete Fenster die XAML ein
Um Ihr untergeordnetes Fenster als Dialogfeld und Zentrum des übergeordneten Fensters aufzurufen, rufen Sie es über das übergeordnete Fenster auf, z
quelle
Zur Dokumentation füge ich hier ein Beispiel hinzu, wie ich etwas Ähnliches erreicht habe. Was ich brauchte, war ein Popup, das den gesamten Inhaltsbereich des übergeordneten Fensters (mit Ausnahme der Titelleiste) abdeckte, aber das einfache Zentrieren des Dialogfelds und das Erweitern des Inhalts funktionierte nicht, da das Dialogfeld immer etwas nach unten versetzt war.
Hinweis zur Benutzererfahrung: Es ist nicht schön, das übergeordnete Fenster nicht ziehen / schließen zu können, wenn das randlose Dialogfeld angezeigt wird. Daher würde ich die Verwendung überdenken. Ich habe mich auch entschieden, dies nicht zu tun, nachdem ich diese Antwort gepostet habe, sondern werde es anderen überlassen, sie anzuschauen.
Nach einigem googeln und testen habe ich es endlich so gemacht:
Das
DialogWindow
ist ein Fenster und sein Besitzer ist auf das Hauptanwendungsfenster eingestellt. DasWindowStartupLocation
muss auf eingestellt sein,Manual
damit die manuelle Positionierung funktioniert.Ergebnis:
Ich weiß nicht, ob es einen einfacheren Weg gibt, aber nichts anderes schien für mich zu funktionieren.
quelle