{"id":55000054,"date":"2016-10-01T00:00:00","date_gmt":"2020-03-27T19:22:10","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=54"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"InputBox_im_Eigenbau","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/InputBox_im_Eigenbau\/","title":{"rendered":"InputBox im Eigenbau"},"content":{"rendered":"<p><b>Wer von Access\/VBA kommt, kann unter WPF die &#8220;MsgBox&#8221;-Anweisung leicht mit den Funktionen der Klasse &#8220;MessageBox&#8221; ersetzen. Allerdings sucht man vergeblich nach einem Pendant zur InputBox-Funktion, die ja ein einfaches Eingabefenster f&uuml;r die Eingabe eines Textes zur Verf&uuml;gung stellt. Doch das ist kein Problem: Unter C#\/WPF k&ouml;nnen Sie ja eigene Fenster erstellen. Warum dann nicht ein Fenster mit Titel, Text, Eingabefeld und OK\/Abbrechen-Schaltfl&auml;chen bauen und dieses bei Bedarf aufrufen<\/b><\/p>\n<h2>Vorgaben InputBox<\/h2>\n<p>Was soll eine InputBox &uuml;berhaupt alles leisten Wir richten uns im Wesentlichen nach der InputBox von Access\/VBA. Diese wird wie folgt aufgerufen, wenn man die hinteren Parameter etwa f&uuml;r die Position und f&uuml;r die Onlinehilfe wegl&auml;sst:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> InputBox(\"Geben Sie einen Text ein.\", \"Texteingabe\", \"[Hier eingeben]\")<\/pre>\n<p>Die <b>Debug.Print<\/b>-Anweisung gibt den zur&uuml;ckgelieferten Wert im Direktfenster des VBA-Editors aus. Wie Sie sehen, verwenden wir hier drei Parameter:<\/p>\n<ul>\n<li><b>Prompt<\/b>: Text, der den Benutzer informiert, welche Eingabe von ihm erwartet wird<\/li>\n<li><b>Title<\/b>: Text f&uuml;r die Titelleiste des Fensters (optional)<\/li>\n<li><b>Default<\/b>: Text, der als Vorgabe im Textfeld angezeigt werden soll (optional)<\/li>\n<\/ul>\n<p>Die InputBox selbst sieht dann wie in Bild 1 aus. Hier gibt es vier Steuerelemente: das Bezeichnungsfeld f&uuml;r den Text aus dem Parameter <b>Prompt<\/b>, das Textfeld zur Eingabe des gesuchten Wertes durch den Benutzer, das gegebenenfalls den Wert aus <b>Default <\/b>anzeigt, sowie die beiden Schaltfl&auml;chen <b>OK <\/b>und <b>Abbrechen<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_54_003.png\" alt=\"InputBox unter VBA\" width=\"424,7115\" height=\"175,9023\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: InputBox unter VBA<\/span><\/b><\/p>\n<p>Wenn der Benutzer die <b>OK<\/b>-Schaltfl&auml;che bet&auml;tigt, soll die Funktion <b>InputBox <\/b>den aktuell im Textfeld befindlichen Text zur&uuml;ckliefern, bei Bet&auml;tigung der <b>Abbrechen<\/b>-Schaltfl&auml;che soll eine leere Zeichenfolge zur&uuml;ckgegeben werden.<\/p>\n<p>Wenn der Benutzer die Eingabetaste dr&uuml;ckt, l&ouml;st er die Funktion der <b>OK<\/b>-Schaltfl&auml;che aus, die <b>Escape<\/b>-Taste bewirkt selbiges f&uuml;r die <b>Abbrechen<\/b>-Schaltfl&auml;che.<\/p>\n<h2>InputBox als Fenster<\/h2>\n<p>Um ein Projekt mit einem Fenster auszustatten, das als InputBox dient, f&uuml;gen Sie diesem einfach ein normales Objekt des Typs <b>Fenster (WPF) <\/b>hinzu. Nennen Sie das Fenster im Dialog <b>Neues Element hinzuf&uuml;gen <\/b>schlicht <b>InputBox<\/b>. Das Fenster statten Sie mit den Steuerelementen aus Bild 2 aus (das Bezeichnungsfeld haben wir markiert, damit man es &uuml;berhaupt erkennt).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_54_001.png\" alt=\"Fenster zur Anzeige einer InputBox im Entwurf\" width=\"424,7115\" height=\"203,2918\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Fenster zur Anzeige einer InputBox im Entwurf<\/span><\/b><\/p>\n<p>Der XAML-Code des Fensters sieht wie in Listing 1 aus.<\/p>\n<pre>&lt;Window x:Class=\"InputBoxImEigenbau.InputBox\"\r\n         xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\r\n         xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\r\n         xmlns:d=\"http:\/\/schemas.microsoft.com\/expression\/blend\/2008\"\r\n         xmlns:mc=\"http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006\"\r\n         xmlns:local=\"clr-namespace:InputBoxImEigenbau\"\r\n         mc:Ignorable=\"d\"\r\n         Title=\"{Binding Titel}\" Height=\"136\" Width=\"300\" WindowStartupLocation=\"CenterScreen\"&gt;\r\n     &lt;Grid&gt;\r\n         &lt;Grid.ColumnDefinitions&gt;\r\n             &lt;ColumnDefinition&gt;&lt;\/ColumnDefinition&gt;\r\n         &lt;\/Grid.ColumnDefinitions&gt;\r\n         &lt;Grid.RowDefinitions&gt;\r\n             &lt;RowDefinition Height=\"33\"&gt;&lt;\/RowDefinition&gt;\r\n             &lt;RowDefinition Height=\"33\"&gt;&lt;\/RowDefinition&gt;\r\n             &lt;RowDefinition Height=\"33\"&gt;&lt;\/RowDefinition&gt;\r\n         &lt;\/Grid.RowDefinitions&gt;\r\n         &lt;Label x:Name=\"lblBezeichnung\" Grid.Row=\"0\" Margin=\"3\"&gt;&lt;\/Label&gt;\r\n         &lt;TextBox x:Name=\"txtEingabe\" Grid.Row=\"1\" Margin=\"3\" Height=\"25\"&gt;&lt;\/TextBox&gt;\r\n         &lt;StackPanel Orientation=\"Horizontal\" Grid.Row=\"2\" HorizontalAlignment=\"Right\"&gt;\r\n             &lt;Button x:Name=\"btnOK\" Height=\"22\" Padding=\"5,2,5,2\" Margin=\"3\" Content=\"OK\" Click=\"btnOK_Click\" \r\n                 IsDefault=\"True\"&gt;&lt;\/Button&gt;\r\n             &lt;Button x:Name=\"btnCancel\" Height=\"22\" Padding=\"5,2,5,2\" Margin=\"3\" Content=\"Abbrechen\" \r\n                 Click=\"btnCancel_Click\" IsCancel=\"True\"&gt;&lt;\/Button&gt;\r\n         &lt;\/StackPanel&gt;\r\n     &lt;\/Grid&gt;\r\n&lt;\/Window&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Code des WPF-Fensters, das als InputBox dienen soll<\/span><\/b><\/p>\n<p>Hier stecken einige Besonderheiten: Das Fenster soll zentriert erscheinen, also erh&auml;lt das <b>Window<\/b>-Element den Wert <b>CenterScreen <\/b>f&uuml;r die Eigenschaft <b>WindowStartupLocation<\/b>.<\/p>\n<p>Die Steuerelemente haben wir in einem Grid arrangiert. In der letzten Zeile des Grids haben wir au&szlig;erdem ein <b>StackPanel <\/b>mit dem Wert <b>Horizontal <\/b>f&uuml;r das Attribut <b>Orientation <\/b>eingebaut, damit wir darin die Schaltfl&auml;chen nebeneinander anordnen k&ouml;nnen. Die Schaltfl&auml;che <b>cmdOK <\/b>erh&auml;lt f&uuml;r die Eigenschaft <b>IsDefault <\/b>den Wert <b>true<\/b>, damit sie beim Bet&auml;tigen der Eingabetaste ausgel&ouml;st wird. <b>cmdAbbrechen <\/b>statten wir mit dem Wert <b>true <\/b>f&uuml;r das Attribut <b>IsCancel <\/b>aus, so l&ouml;st das Bet&auml;tigen der Taste <b>Escape <\/b>diese Schaltfl&auml;che aus.<\/p>\n<h2>Code hinter dem InputBox-Fenster<\/h2>\n<p>Die Code behind-Datei zu unserer InputBox finden Sie in Listing 2. Die Konstruktor-Methode namens <b>InputBox <\/b>erwartet die &Uuml;bergabe dreier Parameter namens <b>Titel<\/b>, <b>Bezeichnung <\/b>und <b>Standardwert<\/b>. Sie initialisiert das Fenster und tr&auml;gt dann den Wert des Parameters <b>Bezeichnung <\/b>f&uuml;r das Attribut <b>Content <\/b>des Elements <b>lblBezeichnung <\/b>ein. Der Wert des Parameters <b>Titel <\/b>wird zun&auml;chst &uuml;berpr&uuml;ft. Wenn der Aufruf diesen Parameter nicht enth&auml;lt, erh&auml;lt dieser zun&auml;chst als Standardwert eine leere Zeichenfolge. Die Methode pr&uuml;ft dann, ob <b>Titel <\/b>leer ist, und ersetzt diesen Wert dann durch den aktuellen Anwendungstitel, der mit <b>System.AppDomain.CurrentDomain.FriendlyName<\/b> ermittelt wird. Danach landet der Inhalt von <b>Titel <\/b>im Attribut <b>Title <\/b>des <b>Window<\/b>-Elements, das mit <b>this <\/b>referenziert wird. Der Wert des Parameters <b>Standardwert <\/b>wird schlie&szlig;lich in die Eigenschaft <b>Text <\/b>des Textfeldes <b>txtEingabe <\/b>eingesetzt.<\/p>\n<pre>using System.Windows;\r\nnamespace InputBoxImEigenbau {\r\n     public partial class InputBox : Window {\r\n         string eingabe;\r\n         public InputBox(string Bezeichnung, string Titel = \"\", string Standardwert=\"\") {\r\n             InitializeComponent();\r\n             this.lblBezeichnung.Content = Bezeichnung;\r\n             if (Titel==\"\") {\r\n                 Titel = System.AppDomain.CurrentDomain.FriendlyName;\r\n             }\r\n             this.Title = Titel;\r\n             this.txtEingabe.Text = Standardwert;\r\n             this.txtEingabe.SelectAll();\r\n             this.txtEingabe.Focus();\r\n         }\r\n         public string Eingabe\r\n         {\r\n             set { eingabe = value; }\r\n             get { return eingabe; }\r\n         }\r\n         private void btnCancel_Click(object sender, RoutedEventArgs e) {\r\n             eingabe = \"\";\r\n             this.Visibility = Visibility.Hidden;\r\n         }\r\n         private void btnOK_Click(object sender, RoutedEventArgs e) {\r\n             eingabe = this.txtEingabe.Text;\r\n             this.Visibility = Visibility.Hidden;\r\n         }\r\n     }\r\n}<\/pre>\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\/55000054\/\">\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\/55000054?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\/55000054\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\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>Wer von Access\/VBA kommt, kann unter WPF die &#8220;MsgBox&#8221;-Anweisung leicht mit den Funktionen der Klasse &#8220;MessageBox&#8221; ersetzen. Allerdings sucht man vergeblich nach einem Pendant zur InputBox-Funktion, die ja ein einfaches Eingabefenster f&uuml;r die Eingabe eines Textes zur Verf&uuml;gung stellt. Doch das ist kein Problem: Unter C#\/WPF k&ouml;nnen Sie ja eigene Fenster erstellen. Warum dann nicht ein Fenster mit Titel, Text, Eingabefeld und OK\/Abbrechen-Schaltfl&auml;chen bauen und dieses bei Bedarf aufrufen<\/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":[662016,66052016,44000002,44000009,44000023,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000054","post","type-post","status-publish","format-standard","hentry","category-662016","category-66052016","category-Benutzeroberflaeche_mit_WPF","category-CProgrammiertechnik","category-PowerApps","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000054","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=55000054"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000054\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000054"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}