{"id":2576,"date":"2022-04-15T08:43:29","date_gmt":"2022-04-15T06:43:29","guid":{"rendered":"https:\/\/ekiwi.de\/?p=2576"},"modified":"2022-04-16T09:10:52","modified_gmt":"2022-04-16T07:10:52","slug":"c-xaml-position-eines-usercontrols-ermitteln","status":"publish","type":"post","link":"https:\/\/ekiwi.de\/index.php\/2576\/c-xaml-position-eines-usercontrols-ermitteln\/","title":{"rendered":"C#\/XAML: Position eines UserControls ermitteln"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Inhalt<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/ekiwi.de\/index.php\/2576\/c-xaml-position-eines-usercontrols-ermitteln\/#WindowStartupLocation_CenterOwner_funktioniert_nicht\" >WindowStartupLocation CenterOwner funktioniert nicht<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/ekiwi.de\/index.php\/2576\/c-xaml-position-eines-usercontrols-ermitteln\/#DialogWindow_an_Position_eines_UserControl_ausrichten\" >Dialog\/Window an Position eines UserControl ausrichten<\/a><\/li><\/ul><\/nav><\/div>\n<p>UserControls sind relativ praktisch aufgrund ihrer mehrfachen Verwendbarkeit. Erstellt man sich komplexere UserControls in C#\/XAML, z.B. mit <a title=\"Sprache von Visual Studio einstellen\" href=\"https:\/\/ekiwi.de\/index.php\/2082\/visual-studio-sprache-aendern\/\">Visual Studio<\/a>, und ruft aus dem UserControl weitere Dialoge\/Windows auf, dann erscheinen diese Dialoge oder Windows irgendwo auf dem Bildschirm.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2577\" src=\"\/wp-content\/uploads\/2022\/04\/window-dialog-to-usercontrol-position.jpg\" alt=\"Screenshot aufgerufenes Window wird irgendwo auf Bildschirm angezeigt\" width=\"701\" height=\"273\" srcset=\"\/wp-content\/uploads\/2022\/04\/window-dialog-to-usercontrol-position.jpg 701w, \/wp-content\/uploads\/2022\/04\/window-dialog-to-usercontrol-position-300x117.jpg 300w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"WindowStartupLocation_CenterOwner_funktioniert_nicht\"><\/span>WindowStartupLocation CenterOwner funktioniert nicht<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Damit ein Dialog m\u00f6glichst innerhalb der Programmoberfl\u00e4che erscheint, kann man den folgenden Code verwenden, welcher den aufgerufenen Dialog mittig ausrichtet \u00fcber den Element aus dem es aufgerufen wurde. Wichtig ist, dass vor dem Aufruf die Eigenschaft <em>Owner<\/em> gesetzt wurde.<\/p>\n<p><code>this.WindowStartupLocation = WindowStartupLocation.CenterOwner;<\/code><\/p>\n<p>Das Problem ist nur, dass <em>WindowStartupLocation<\/em> im Zusammenhang mit einem Usercontrol nicht funktioniert.<\/p>\n<p><code>dialog.Owner = MyUserControl;<\/code><\/p>\n<p>Dies schmei\u00dft einen Fehler<\/p>\n<blockquote><p>Cannot implicitly convert type &#8218;UserControlType&#8216; to &#8218;System.Windows.Window&#8216;<\/p><\/blockquote>\n<p>Ursache ist, dass das UserControl selbst nicht <em>Owner<\/em> sein kann, denn aufgrund seiner Mehrfachverwendung ist es ja nur ein Element innerhalb eines Windows\/Dialoges. Dass hei\u00dft man m\u00fcsste vom UserControl das <em>Parent<\/em>-Window ermitteln.<\/p>\n<p><code>UserControl.Parent as Window<\/code><\/p>\n<p>Da ein UserControl Element eines weiteren UserControl und dieses auch wieder ein Element eines weiteren UserControl sein kann, m\u00fcsste man versuchen den Parent \u00fcber eine Schleife zu ermitteln, sonst schl\u00e4gt auch diese Vorgehensweise fehl.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"DialogWindow_an_Position_eines_UserControl_ausrichten\"><\/span>Dialog\/Window an Position eines UserControl ausrichten<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>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 \u00fcbergeben.<\/p>\n<p><code>MyDialog dialog = new (MyParameter);<br \/>\nPoint p = MyUserControl.PointToScreen(new Point(0, 0));<br \/>\ndialog.Top = p.Y;<br \/>\ndialog.Left = p.X;<br \/>\ndialog.ShowDialog();<\/code><\/p>\n<p>&#8222;MyUserControl&#8220; kann auch ersetzt werden durch ein bestimmtes Element auf dem UserControl, z.B. einem Button. Dann wird der Dialog genau an diesem Button ausgerichtet.<\/p>\n<figure id=\"attachment_2578\" aria-describedby=\"caption-attachment-2578\" style=\"width: 701px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2578\" src=\"\/wp-content\/uploads\/2022\/04\/position-window-dialog-to-usercontrol.jpg\" alt=\"Screenshot Dialog hat die Position\/Location des UserControl\" width=\"701\" height=\"240\" srcset=\"\/wp-content\/uploads\/2022\/04\/position-window-dialog-to-usercontrol.jpg 701w, \/wp-content\/uploads\/2022\/04\/position-window-dialog-to-usercontrol-300x103.jpg 300w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><figcaption id=\"caption-attachment-2578\" class=\"wp-caption-text\">Dialog wird an Location des UserControl aufgerufen<\/figcaption><\/figure>","protected":false},"excerpt":{"rendered":"<p>UserControls sind relativ praktisch aufgrund ihrer mehrfachen Verwendbarkeit. Erstellt man sich komplexere UserControls in C#\/XAML, z.B. mit Visual Studio, und<\/p>\n","protected":false},"author":2,"featured_media":1011,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[13],"tags":[190,136,559,191],"class_list":["post-2576","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programmierung","tag-c","tag-programmieren","tag-programming","tag-visual-studio"],"_links":{"self":[{"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/posts\/2576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/comments?post=2576"}],"version-history":[{"count":0,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/posts\/2576\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/media\/1011"}],"wp:attachment":[{"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/media?parent=2576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/categories?post=2576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ekiwi.de\/index.php\/wp-json\/wp\/v2\/tags?post=2576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}