{"id":55000036,"date":"2016-04-01T00:00:00","date_gmt":"2020-03-27T19:19:51","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=36"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Tipps_und_Tricks_zu_Fenstern_und_Steuerelementen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Tipps_und_Tricks_zu_Fenstern_und_Steuerelementen\/","title":{"rendered":"Tipps und Tricks zu Fenstern und Steuerelementen"},"content":{"rendered":"<p><b>In dieser Reihe unserer Tipps und Tricks erfahren Sie einiges &uuml;ber Fenster und Steuerelemente: Wie setzen Sie den Fokus auf ein Steuerelement Wie legen Sie die Aktivierreihenfolge von Steuerelementen fest Wie zentrieren Sie ein Fenster Wie &ouml;ffnen Sie ein Fenster relativ zum aufrufenden Fenster Wie &uuml;bergeben Sie Parameter beim &Ouml;ffnen an ein Fenster Wie legen Sie ein Anwendungssymbol fest und wie eines f&uuml;r ein einzelnes Fenster Mehr dazu auf den folgenden Seiten!<\/b><\/p>\n<h2>Fokus auf ein Steuerelement setzen<\/h2>\n<p>Im Gegensatz zu Access-Formularen landet der Fokus unter WPF nicht unbedingt sichtbar auf einem Steuerelement.<\/p>\n<p>Daher schauen wir uns nun an, wie Sie den Fokus etwa beim &Ouml;ffnen des Fensters auf das gew&uuml;nschte Steuerelement verschieben. Dazu gibt es mindestens zwei Methoden: eine per XAML und eine per C#.<\/p>\n<p>Um beide auszuprobieren, f&uuml;gen wir dem Fenster <b>MainWindow <\/b>zwei Schaltfl&auml;chen hinzu, mit denen wir die beiden weiteren Fenster <b>FokusPerXAML<\/b> und <b>FokusPerCSharp <\/b>&ouml;ffnen. Beide sollen den Fokus jeweils auf das erste Textfeld verschieben (siehe Bild 1).<\/p>\n<p>Unter XAML legen Sie in einem &uuml;bergeordneten Element des betroffenen Elements fest, welches Element den Fokus erhalten soll &#8211; in diesem Fall im <b>Grid<\/b>-Element. Dort f&uuml;gen Sie das Attribut <b>FocusManager.FocusedElement <\/b>hinzu und tragen als Wert <b>&#8220;{Binding ElementName=textBox}&#8221;<\/b> ein. Alles l&auml;sst sich einfach per IntelliSense hinzuf&uuml;gen:<\/p>\n<pre>&lt;Window x:Class=\"TippsControls.FokusPerXAML\" ...                                      Title=\"FokusPerXAML\"&gt;\r\n     &lt;Grid FocusManager.FocusedElement=\r\n                           \"{Binding ElementName=textBox}\"&gt;\r\n         &lt;Label x:Name=\"label\" Content=\"Label:\" ...\/&gt;\r\n         &lt;TextBox x:Name=\"textBox\" Text=\"TextBox\" ...\/&gt;\r\n         ...\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p>Das Textfeld <b>textBox<\/b> erh&auml;lt dann gleich nach dem &Ouml;ffnen des Fensters den Fokus. Unter C# ist es noch etwas einfacher. Hier definieren Sie mit dem Attribut <b>Loaded <\/b>den Ereignishandler, der beim Laden des Fensters aufgerufen werden soll:<\/p>\n<pre>&lt;Window ... Loaded=\"Window_Loaded\"&gt;\r\n     ...\r\n&lt;\/Window&gt;<\/pre>\n<p>Dann f&uuml;gen Sie der entsprechenden Methode eine einzige Anweisung hinzu, welche die Methode <b>Focus <\/b>des Steuerelements aufruft:<\/p>\n<pre>private void Window_Loaded(...) {\r\n     this.textBox.Focus();\r\n}<\/pre>\n<p>Damit verschiebt auch diese Variante beim &Ouml;ffnen den Fokus auf das erste Textfeld.<\/p>\n<h2>Aktivierreihenfolge festlegen<\/h2>\n<p>Unter Access haben Sie die Aktivierreihenfolge in einem speziell daf&uuml;r vorgesehenen Dialog festgelegt. Unter WPF l&auml;uft das etwas anders. Wenn Sie nichts weiter tun, entspricht die Aktivierungsreihenfolge der Reihenfolge, in der Sie die Elemente im XAML-Code angelegt haben. Solange diese Reihenfolge der gew&uuml;nschten Aktivierreihenfolge entspricht, ist alles okay.<\/p>\n<p>Wenn Sie aber nun beispielsweise ein neues Textfeld plus Bezeichnungsfeld (<b>Label<\/b>) aus der Toolbox zwischen zwei vorhandene Textfelder einf&uuml;gen, funktioniert die Aktivierreihenfolge nicht mehr wie gew&uuml;nscht. Nun wird erst das erste, dann das dritte und schlie&szlig;lich das zweite Textfeld aktiviert. Um dies zu &auml;ndern, m&uuml;ssten Sie also die Reihenfolge der Elemente im XAML-Code anpassen.<\/p>\n<p>Davon abgesehen, dass ein wenig Ordnung im XAML-Code nicht schaden kann, kann es nat&uuml;rlich Gr&uuml;nde geben, eine Aktivierreihenfolge vorzugeben, die nicht von der Gestaltung des XAML-Codes abh&auml;ngt. F&uuml;r solche F&auml;lle bietet WPF das Attribut <b>KeyboardNavigation.TabIndex <\/b>an, das Sie f&uuml;r alle relevanten Steuerelemente hinzuf&uuml;gen:<\/p>\n<pre>&lt;Window x:Class=\"TippsControls.Aktivierreihenfolge\" ...&gt;\r\n     &lt;Grid&gt;\r\n         &lt;Label x:Name=\"label1\" ...\/&gt;\r\n         &lt;TextBox x:Name=\"txt1\" ...\r\n             KeyboardNavigation.TabIndex=\"1\" \/&gt;\r\n         &lt;Label x:Name=\"label2\" ...\/&gt;\r\n         &lt;TextBox x:Name=\"txt2\" ... \r\n             KeyboardNavigation.TabIndex=\"2\"\/&gt;\r\n         ...\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p>Soll ein Steuerelement gar nicht in die Aktivierreihenfolge einbezogen werden, stellen Sie das Attribut <b>IsTabStop <\/b>auf den Wert <b>False <\/b>ein:<\/p>\n<pre>&lt;TextBox x:Name=\"txt3\" ... IsTabStop=\"False\" \/&gt;<\/pre>\n<p>Der Standardwert dieses Attributs lautet <b>True<\/b>.<\/p>\n<h2>Fenster zentrieren<\/h2>\n<p>Ohne weiteres Zutun &ouml;ffnen sich die Fenster einer WPF-Anwendung irgendwo, zum Beispiel im linken, oberen Bereich des Bildschirms. Wenn Sie m&ouml;chten, dass sich Fenster genau in der Mitte des Bildschirms &ouml;ffnen, k&ouml;nnen Sie dies mit einer einfachen Einstellung erreichen. Dazu legen Sie im XAML-Code einfach den Wert des Attributs <b>WindowStartup-Location <\/b>f&uuml;r das <b>Window<\/b>-Element auf <b>CenterScreen <\/b>fest:<\/p>\n<pre>&lt;Window ... Title=\"FensterZentrieren\"     Height=\"150\" Width=\"300\" \r\n     WindowStartupLocation=\"CenterScreen\"&gt;<\/pre>\n<p>Wenn Sie dies auch noch f&uuml;r ein vom Hauptfenster ge&ouml;ffnetes Fenster erledigen, wird dieses zentriert &uuml;ber dem anderen Fenster ge&ouml;ffnet (siehe Bild 2).<\/p>\n<p>Das Attribut <b>WindowStartupLocation <\/b>hat drei m&ouml;gliche Werte:<\/p>\n<ul>\n<li><b>CenterScreen<\/b>: Fenster wird zentriert bezogen auf den Bildschirm angezeigt.<\/li>\n<li><b>CenterOwner<\/b>: Fenster wird zentriert bezogen auf das aufrufende Fenster ge&ouml;ffnet.<\/li>\n<li><b>Manual<\/b>: Fenster wird entsprechend den Werten f&uuml;r <b>Left <\/b>und <b>Top <\/b>ge&ouml;ffnet.<\/li>\n<\/ul>\n<h2>Fenster relativ zum Hauptfenster &ouml;ffnen<\/h2>\n<p>Unter Access und VBA war das &Ouml;ffnen eines Formulars relativ zur Position des aufrufenden Formulars erst nachtr&auml;glich durch den Einsatz der Methode <b>DoCmd.MoveSize <\/b>m&ouml;glich. Unter C# und WPF gelingt dies wesentlich einfacher. Das liegt daran, dass wir hier im Gegensatz zur unter Access &uuml;blichen Vorgehensweise mit der <b>DoCmd.OpenForm<\/b>-Methode das zu &ouml;ffnende Fenster als Objekt betrachten und dieses erst deklarieren und initialisieren und dann erst &ouml;ffnen. Unter Access war dies zwar auch mit Formularen m&ouml;glich, aber wenig verbreitet.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000036\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000036?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000036\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"d3a54aea21\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In dieser Reihe unserer Tipps und Tricks erfahren Sie einiges &uuml;ber Fenster und Steuerelemente: Wie setzen Sie den Fokus auf ein Steuerelement Wie legen Sie die Aktivierreihenfolge von Steuerelementen fest Wie zentrieren Sie ein Fenster Wie &ouml;ffnen Sie ein Fenster relativ zum aufrufenden Fenster Wie &uuml;bergeben Sie Parameter beim &Ouml;ffnen an ein Fenster Wie legen Sie ein Anwendungssymbol fest und wie eines f&uuml;r ein einzelnes Fenster Mehr dazu auf den folgenden Seiten!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022016,662016,44000002,44000005,44000025],"tags":[],"yst_prominent_words":[66062023,66062053],"class_list":["post-55000036","post","type-post","status-publish","format-standard","hentry","category-66022016","category-662016","category-Benutzeroberflaeche_mit_WPF","category-Tipps_und_Tricks","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000036","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000036"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000036\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000036"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000036"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000036"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000036"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}