C#/XAML: Position eines UserControls ermitteln

UserControls sind relativ praktisch aufgrund ihrer mehrfachen Verwendbarkeit. Erstellt man sich komplexere UserControls in C#/XAML, z.B. mit Visual Studio, und ruft aus dem UserControl weitere Dialoge/Windows auf, dann erscheinen diese Dialoge oder Windows irgendwo auf dem Bildschirm.

Screenshot aufgerufenes Window wird irgendwo auf Bildschirm angezeigt

WindowStartupLocation CenterOwner funktioniert nicht

Damit ein Dialog möglichst innerhalb der Programmoberfläche erscheint, kann man den folgenden Code verwenden, welcher den aufgerufenen Dialog mittig ausrichtet über den Element aus dem es aufgerufen wurde. Wichtig ist, dass vor dem Aufruf die Eigenschaft Owner gesetzt wurde.

this.WindowStartupLocation = WindowStartupLocation.CenterOwner;

Das Problem ist nur, dass WindowStartupLocation im Zusammenhang mit einem Usercontrol nicht funktioniert.

dialog.Owner = MyUserControl;

Dies schmeißt einen Fehler

Cannot implicitly convert type ‘UserControlType’ to ‘System.Windows.Window’

Ursache ist, dass das UserControl selbst nicht Owner sein kann, denn aufgrund seiner Mehrfachverwendung ist es ja nur ein Element innerhalb eines Windows/Dialoges. Dass heißt man müsste vom UserControl das Parent-Window ermitteln.

UserControl.Parent as Window

Da ein UserControl Element eines weiteren UserControl und dieses auch wieder ein Element eines weiteren UserControl sein kann, müsste man versuchen den Parent über eine Schleife zu ermitteln, sonst schlägt auch diese Vorgehensweise fehl.

Dialog/Window an Position eines UserControl ausrichten

Um nun einen Dialog/Window, welches von einem User Control aufgerufen wird, an dem UserControl auszurichten, verwende ich den folgenden Code zur Ermittlung der Location auf dem Screen. Diese wird dann an den Dialog/Window übergeben.

MyDialog dialog = new (MyParameter);
Point p = MyUserControl.PointToScreen(new Point(0, 0));
dialog.Top = p.Y;
dialog.Left = p.X;
dialog.ShowDialog();

“MyUserControl” kann auch ersetzt werden durch ein bestimmtes Element auf dem UserControl, z.B. einem Button. Dann wird der Dialog genau an diesem Button ausgerichtet.

Screenshot Dialog hat die Position/Location des UserControl
Dialog wird an Location des UserControl aufgerufen

3 Kommentare

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert