{"id":55000265,"date":"2021-06-01T00:00:00","date_gmt":"2021-11-10T09:32:52","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=265"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Das_WPF_WebbrowserSteuerelement","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Das_WPF_WebbrowserSteuerelement\/","title":{"rendered":"Das WPF Webbrowser-Steuerelement"},"content":{"rendered":"<p><b>Es gibt verschiedene Gr&uuml;nde, warum Sie ein Webbrowser-Steuerelement in Ihrer Anwendung ben&ouml;tigen k&ouml;nnten. Vielleicht m&ouml;chten Sie einfach die M&ouml;glichkeit bieten, bestimmte Webseiten anzuzeigen. Oder Sie wollen es zur Anzeige von HTML-Inhalten verwenden, die Sie aus Dateien lesen oder per Code zusammenstellen. Schlie&szlig;lich bietet HTML einige M&ouml;glichkeiten, die anders oder besser zu realisieren sind als unter WPF. Dann k&ouml;nnen Sie das Webbrowser-Steuerelement verwenden, um die Benutzeroberfl&auml;che der WPF-Anwendung zu erweitern. Dieser Artikel erl&auml;utert die Grundlagen f&uuml;r die Programmierung des WPF Webbrowser-Steuerelements.<\/b><\/p>\n<h2>WPF Webbrowser-Steuerelement hinzuf&uuml;gen<\/h2>\n<p>Das WPF Webbrowser-Steuerelement f&uuml;gen Sie wie die &uuml;brigen Steuerelemente auf verschiedene Arten zu einem WPF-Fenster hinzu. Sie k&ouml;nnen es beispielsweise aus dem Bereich <b>Alle WPF-Steuerelemente <\/b>aus der <b>Toolbox <\/b>in das WPF-Fenster ziehen oder dieses anklicken und dann im WPF-Fenster einen Rahmen aufziehen, der direkt die Gr&ouml;&szlig;e des Steuerelements angibt.<\/p>\n<p>Wer lieber mit Code arbeitet, f&uuml;gt schlicht das Element <b>Webbrowser <\/b>in das <b>Grid<\/b>-Element des Fensters ein. Wir legen hier mit <b>wb <\/b>direkt den Namen des Steuerelements fest, damit wir es sp&auml;ter leichter referenzieren k&ouml;nnen:<\/p>\n<pre>&lt;Grid&gt;\r\n     &lt;WebBrowser x:Name=\"wb\"&gt;&lt;\/WebBrowser&gt;\r\n&lt;\/Grid&gt;<\/pre>\n<p>Damit ist allerdings noch nichts erreicht, denn das WPF Webbrowser-Steuerelement l&auml;dt weder von selbst eine Seite noch bietet es Benutzeroberfl&auml;chen-Elemente wie ein Textfeld zur Eingabe einer URL oder Schaltfl&auml;chen zum Navigieren. Also legen wir in den n&auml;chsten Abschnitten selbst Hand an und f&uuml;gen die ben&ouml;tigten Elemente hinzu.<\/p>\n<h2>Anzeigen einer Webseite beim Starten der Anwendung<\/h2>\n<p>Damit das WPF Webbrowser-Steuerelement beim Starten der Anwendung wie in Bild 1 direkt eine Webseite anzeigt, f&uuml;gen wir eine Ereignismethode hinzu, die durch das Ereignis <b>Loaded <\/b>des <b>Window<\/b>-Elements ausgel&ouml;st wird. Das ben&ouml;tigte Attribut sieht wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_265_001.png\" alt=\"Anzeige einer Webseite im WPF Webbrowser-Steuerelement\" width=\"599,593\" height=\"337,6051\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anzeige einer Webseite im WPF Webbrowser-Steuerelement<\/span><\/b><\/p>\n<pre>&lt;Window x:Class=\"MainWindow\" ...  Loaded=\"Window_Loaded\"&gt;<\/pre>\n<p>Die Ereignismethode <b>Window_Loaded <\/b>implementieren wir wie folgt und f&uuml;gen als einzige Anweisung einen Aufruf der <b>Navigate<\/b>-Methode des WPF Webbrowser-Steuerelements hinzu, das wir mit <b>wb <\/b>benannt haben. Die <b>Navigate<\/b>-Methode erwartet die URL als Parameter:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Window_Loaded(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     wb.Navigate(\"http:\/\/www.google.de\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Navigieren per URL-Textfeld<\/h2>\n<p>Normalerweise werden Sie nicht nur eine Seite anzeigen wollen, sondern dem Benutzer die Gelegenheit geben wollen, selbst eine URL einzugeben, die das WPF Webbrowser-Steuerelement anzeigen soll. Dazu f&uuml;gen wir &uuml;ber dem Webbrowser-Steuerelement ein Textfeld plus Bezeichnungsfeld hinzu sowie eine Schaltfl&auml;che zum Anzeigen der gew&uuml;nschten URL.<\/p>\n<p>Im XAML-Code legen wir daf&uuml;r ein <b>DockPanel<\/b>-Element an, das oben ein <b>Grid<\/b>-Element mit <b>Label<\/b>, <b>TextBox <\/b>und <b>Button <\/b>enth&auml;lt sowie unten das <b>Webbrowser<\/b>-Steuerelement:<\/p>\n<pre>&lt;DockPanel&gt;\r\n     &lt;Grid DockPanel.Dock=\"Top\"&gt;&lt;\r\n         &lt;Grid.ColumnDefinitions&gt;\r\n             &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n             &lt;ColumnDefinition Width=\"*\"&gt;&lt;\/ColumnDefinition&gt;\r\n             &lt;ColumnDefinition Width=\"Auto\"&gt;&lt;\/ColumnDefinition&gt;\r\n         &lt;\/Grid.ColumnDefinitions&gt;\r\n         &lt;Label Grid.Column=\"0\"&gt;URL:&lt;\/Label&gt;\r\n         &lt;TextBox x:Name=\"txtURL\" Grid.Column=\"1\"&gt;&lt;\/TextBox&gt;\r\n         &lt;Button x:Name=\"btnNavigate\" Grid.Column=\"2\" Click=\"btnNavigate_Click\"&gt;Navigate&lt;\/Button&gt;\r\n     &lt;\/Grid&gt;\r\n     &lt;WebBrowser x:Name=\"wb\"&gt;&lt;\/WebBrowser&gt;\r\n&lt;\/DockPanel&gt;<\/pre>\n<h2>Navigieren per Klick ausl&ouml;sen<\/h2>\n<p>Um den Navigationsvorgang auszul&ouml;sen, reicht eigentlich die folgende Methode:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnNavigate_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     strURL = txtURL.Text\r\n     wb.Navigate(strURL)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese setzt allerdings voraus, dass der Benutzer eine vollst&auml;ndige URL liefert, also beispielsweise inklusive <b>http:\/\/ <\/b>oder <b>https:\/\/<\/b>. Dann k&ouml;nnen wir beim Anklicken der Schaltfl&auml;che den Text des Textfeldes <b>txtURL <\/b>in eine <b>String<\/b>-Variable einlesen und deren Inhalt der Methode <b>Navigate <\/b>als Parameter &uuml;bergeben. Gibt der Benutzer allerdings beispielsweise nur <b>www.google.de <\/b>an, erhalten wir den Fehler aus Bild 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_265_002.png\" alt=\"Fehler bei Angabe einer URL ohne http:\/\/\" width=\"599,593\" height=\"148,617\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Fehler bei Angabe einer URL ohne http:\/\/<\/span><\/b><\/p>\n<p>Wenn wir diesen Fehler ausschlie&szlig;en wollen, k&ouml;nnen wir eine leicht abgewandelte Version der zuvor vorgestellten Methode nutzen. Hier f&uuml;hren wir das Objekt <b>objUri <\/b>mit dem Typ <b>Uri <\/b>ein. Wir schreiben den Inhalt von <b>txtURL <\/b>wieder in <b>strURL<\/b>. Dann erstellen wir ein neues Objekt des Typs <b>UriBuilder <\/b>und &uuml;bergeben diesem den Inhalt von <b>strURL<\/b>. Die Eigenschaft <b>Uri <\/b>dieses Objekts liefert das erstellte <b>Uri<\/b>-Objekt und wir speichern es in <b>objURI<\/b>. Dieses &uuml;bergeben wir schlie&szlig;lich als Parameter an die <b>Navigate<\/b>-Methode:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnNavigate_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objURI<span style=\"color:blue;\"> As <\/span>Uri\r\n     strURL = txtURL.Text\r\n     objURI = <span style=\"color:blue;\">New<\/span> UriBuilder(strURL).Uri\r\n     wb.Navigate(objURI)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auf diese Weise kann der Benutzer auch Internetadressen ohne Angabe von <b>http:\/\/ <\/b>oder <b>https:\/\/ <\/b>in das Textfeld eingeben.<\/p>\n<h2>Seite direkt beim Bet&auml;tigen der Eingabetaste &ouml;ffnen<\/h2>\n<p>Benutzerfreundlicher wird die L&ouml;sung, wenn wir dem Benutzer die Bet&auml;tigung der Eingabetaste zum Aufrufen der angegebenen Seite anbieten. Dazu f&uuml;gen wir dem <b>TextBox<\/b>-Element <b>txtURL <\/b>noch das <b>KeyDown<\/b>-Attribut hinzu, f&uuml;r das wir die folgende Ereignismethode hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtURL_KeyDown(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>KeyEventArgs)\r\n     <span style=\"color:blue;\">If <\/span>(e.Key = Key.Enter)<span style=\"color:blue;\"> Then<\/span>\r\n         btnNavigate_Click(Me, <span style=\"color:blue;\">New<\/span> RoutedEventArgs)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/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\/55000265\/\">\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\/55000265?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\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000265\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"495fc102af\"\/>\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>Es gibt verschiedene Gr&uuml;nde, warum Sie ein Webbrowser-Steuerelement in Ihrer Anwendung ben&ouml;tigen k&ouml;nnten. Vielleicht m&ouml;chten Sie einfach die M&ouml;glichkeit bieten, bestimmte Webseiten anzuzeigen. Oder Sie wollen es zur Anzeige von HTML-Inhalten verwenden, die Sie aus Dateien lesen oder per Code zusammenstellen. Schlie&szlig;lich bietet HTML einige M&ouml;glichkeiten, die anders oder besser zu realisieren sind als unter WPF. Dann k&ouml;nnen Sie das Webbrowser-Steuerelement verwenden, um die Benutzeroberfl&auml;che der WPF-Anwendung zu erweitern. Dieser Artikel erl&auml;utert die Grundlagen f&uuml;r die Programmierung des WPF Webbrowser-Steuerelements.<\/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":[662021,66032021,44000027,44000017,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000265","post","type-post","status-publish","format-standard","hentry","category-662021","category-66032021","category-Excel_programmieren","category-WebApps_Razor_Pages","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000265","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=55000265"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000265\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000265"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}