{"id":55000204,"date":"2020-02-01T00:00:00","date_gmt":"2020-06-15T11:35:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=204"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Das_RichTextBoxSteuerelement","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Das_RichTextBoxSteuerelement\/","title":{"rendered":"Das RichTextBox-Steuerelement"},"content":{"rendered":"<p><b>Die beiden Steuer-elemente TextBox und TextBlock reichen f&uuml;r die Darstellung einfacher Texte aus. Wenn die Texte jedoch formatiert oder sogar strukturiert dargestellt werden sollen, brauchen wir eine Alternative. Im Artikel &#8220;FlowDocument-Elemente mit XAML&#8221; haben Sie bereits das FlowDocument-Element kennen gelernt, das viele M&ouml;glichkeiten bietet einschlie&szlig;lich Abs&auml;tze, Inline-Formatierungen, Listen, Tabellen und Abbildungen. Nun wollen wir uns ansehen, wie uns das RichTextBox-Steuerelement dabei unterst&uuml;tzen kann, diese Art von Dokumenten zu bearbeiten.<\/b><\/p>\n<p><b>FlowDocument als Inhalt von RichTextBox-Steuerelementen<\/b><\/p>\n<p><b>RichTextBox<\/b>-Steuerelemente enthalten immer ein <b>FlowDocument<\/b>-Element als Inhalt. Wenn Sie also Text in ein solches Steuerlement eingeben, dann wird dieser Text im Hintergrund als Inhalt eines <b>FlowDocument<\/b>-Elements gespeichert.<\/p>\n<p>Ein <b>FlowDocument<\/b>, das haben wir bereits im Artikel <b>FlowDocument-Elemente mit XAML <\/b>beschrieben, ist im Prinzip ein XML-Dokument, das sowohl den Inhalt als auch die Formatierungen und die Strukturierung des Dokuments enth&auml;lt.<\/p>\n<p>Wir wollen ein Fenster erzeugen, dass in einem Grid ein Label und ein <b>RichTextBox<\/b>-Steuerelement enth&auml;lt. Dieses <b>RichTextBox<\/b>-Element soll den Inhalt eines der <b>FlowDocument<\/b>-Elemente, die wir im oben genannten Artikel erzeugt haben, darstellen (siehe Bild 1). Dazu nutzen wir den folgenden Code:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_204_001.png\" alt=\"RichTextBox-Element mit formatiertem Text, der sich aber nicht formatieren l&auml;sst\" width=\"649,559\" height=\"449,6165\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: RichTextBox-Element mit formatiertem Text, der sich aber nicht formatieren l&auml;sst<\/span><\/b><\/p>\n<pre>&lt;Grid&gt;\r\n     &lt;Grid.RowDefinitions&gt;\r\n         &lt;RowDefinition Height=\"Auto\"&gt;&lt;\/RowDefinition&gt;\r\n         &lt;RowDefinition Height=\"*\"&gt;&lt;\/RowDefinition&gt;\r\n     &lt;\/Grid.RowDefinitions&gt;\r\n     &lt;Label Grid.Row=\"0\" Margin=\"5\"&gt;RichTextBox-Steuerelement mit vorgegebenem Inhalt:&lt;\/Label&gt;\r\n     &lt;RichTextBox Grid.Row=\"1\" Margin=\"5\"&gt;\r\n         &lt;FlowDocument IsOptimalParagraphEnabled=\"True\" IsHyphenationEnabled=\"True\" TextAlignment=\"Left\"&gt;\r\n             &lt;Paragraph FontSize=\"16\" FontFamily=\"Arial\" FontWeight=\"Bold\"&gt;Zwischen&uuml;berschrift&lt;\/Paragraph&gt;\r\n             ...\r\n         &lt;\/FlowDocument&gt;\r\n     &lt;\/RichTextBox&gt;\r\n&lt;\/Grid&gt;<\/pre>\n<p>Wir haben hier direkt den Beispielcode aus dem Artikel <b>FlowDocument-Elemente mit XAML <\/b>(<b>www.datenbankentwickler.net\/203<\/b>) in den Code integriert, damit wir direkt Text zum Herumprobieren haben. Im Artikel <b>FlowDocument-Elemente mit VB <\/b>(<b>www.datenbankentwickler.net\/210<\/b>) zeigen wir, wie Sie <b>FlowDocument<\/b>-Elemente per VB mit Inhalt f&uuml;llen, diese auslesen oder bearbeiten.<\/p>\n<p>Leider zeigt das <b>RichTextBox<\/b>-Element in der aktuellen Konfiguration keine Steuer-elemente zum Formatieren des Textes an &#8211; zun&auml;chst keine offensichtlichen, aber auch keine &uuml;ber das Kontextmen&uuml;. Au&szlig;erdem sehen wir in der Abbildung auch direkt, dass sich das <b>RichTextBox<\/b>-Element deutlich von den Steuerelementen zur Anzeige von <b>FlowDocument<\/b>-Elementen unterscheidet. Der Inhalt wird immer in einer Spalte angezeigt, es gibt keine Zoom- und auch keine Suchfunktion.<\/p>\n<p>Wir haben es also mit einem Steuerelement rein zum Bearbeiten des Inhalts zu tun. Damit Sie den enthaltenen Text auch in gewohnter Form bearbeiten k&ouml;nnen, f&uuml;gen wir im Artikel <b>Format-Men&uuml; f&uuml;r die RichTextBox <\/b>(<b>www.datenbankentwickler.net\/205<\/b>) ein passendes Men&uuml; hinzu.<\/p>\n<p><b>RichTextBox-Steuerelement leeren<\/b><\/p>\n<p>Wenn Sie mit einem leeren <b>RichTextBox<\/b>-Steuerelement fortfahren wollen, k&ouml;nnen Sie das schnell erledigen, indem Sie den kompletten Inhalt markieren (mit <b>Strg + A<\/b>) und dann die <b>Entf<\/b>-Taste bet&auml;tigen. Sie finden dann ein leeres <b>RichTextBox<\/b>-Steuerelement vor (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_204_002.png\" alt=\"Geleertes RichTextBox-Steuerelement\" width=\"424,7115\" height=\"191,0729\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Geleertes RichTextBox-Steuerelement<\/span><\/b><\/p>\n<p><b>Kompletten Inhalt markieren<\/b><\/p>\n<p>Wir wollen zeigen, wie Sie per VB den kompletten Inhalt des <b>RichTextBox<\/b>-Steuerelements markieren. Dazu f&uuml;gen wir eine erste Schaltfl&auml;che oberhalb des <b>RichTextBox<\/b>-Steuerelements hinzu, die wir wie folgt in ein <b>StackPanel<\/b>-Element mit horizontaler Ausrichtung einschlie&szlig;en:<\/p>\n<pre>&lt;StackPanel Orientation=\"Horizontal\" Grid.Row=\"1\"&gt;\r\n     &lt;Button x:Name=\"btnAllesMarkieren\" Click=\"BtnAllesMarkieren_Click\"&gt;Alles markieren&lt;\/Button&gt;\r\n&lt;\/StackPanel&gt;<\/pre>\n<p>Die Ereignismethode enth&auml;lt den Aufruf der <b>SelectAll<\/b>-Methode des <b>RichTextBox<\/b>-Steuerelements sowie die Anweisung zum Verschieben des Fokus auf dieses Steuer-element (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_204_003.png\" alt=\"Markieren des vollst&auml;ndigen Inhalts des RichTextBox-Steuerelements\" width=\"599,593\" height=\"348,0286\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Markieren des vollst&auml;ndigen Inhalts des RichTextBox-Steuerelements<\/span><\/b><\/p>\n<p>Die <b>SelectAll<\/b>-Methode reicht zwar aus, um den Inhalt des <b>RichTextBox<\/b>-Steuerelements zu markieren, aber solange das Steuer-element nicht den Fokus hat, wird die Markierung nicht angezeigt. Daher m&uuml;ssen wir noch den Fokus auf das <b>RichTextBox<\/b>-Element verschieben.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BtnAllesMarkieren_Click(...)\r\n     rtb.SelectAll()\r\n     rtb.Focus()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Text ausgeben<\/b><\/p>\n<p>Um den vollst&auml;ndigen Text auszugeben, m&uuml;ssen wir einen etwas anderen Weg gehen als etwa bei einem Textfeld. Hier reicht es, &uuml;ber das <b>Text<\/b>-Attribut auf den Inhalt zuzugreifen.<\/p>\n<p>Dazu deklarieren wir ein <b>Text-Range<\/b>-Objekt namens &#8211;<b>objTextRange <\/b>und f&uuml;llen dieses mit einem neuen Objekt dieses Typs mit den Konstruktor-Parametern <b>rtb.Document.ContentStart <\/b>und <b>rtb.Document.ContentEnd<\/b>. Dann geben wir den Inhalt von <b>objTextRange <\/b>&uuml;ber die <b>Text<\/b>-Eigenschaft in einem Meldungsfenster aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BtnInhaltAusgeben_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>objTextRange<span style=\"color:blue;\"> As <\/span>TextRange\r\n     objTextRange = <span style=\"color:blue;\">New<\/span> TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd)\r\n     MessageBox.Show(objTextRange.Text)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis zeigt Bild 4. Hier ist zu erkennen, dass die Ausgabe ohne Formatierungen geliefert wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_204_004.png\" alt=\"Ausgabe des Inhalts des RichTextBox-Steuerelements\" width=\"599,593\" height=\"456,3733\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgabe des Inhalts des RichTextBox-Steuerelements<\/span><\/b><\/p>\n<p><b>Markierten Text auslesen<\/b><\/p>\n<p>Den aktuell markierten Text ermitteln wir mit der <b>Selection<\/b>-Eigenschaft des <b>RichTextBox<\/b>-Steuerelements. Dieses bietet mit der <b>Text<\/b>-Eigenschaft die M&ouml;glichkeit, den enthaltenen Text auszulesen. Die folgende Methode gibt den markierten Text aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BtnMarkierterText_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>strSelection<span style=\"color:blue;\"> As String<\/span>\r\n     strSelection = rtb.Selection.Text\r\n     MessageBox.Show(strSelection)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Auf &Auml;nderung der Markierung reagieren<\/b><\/p>\n<p>Manchmal will man auf das Setzen oder &Auml;ndern einer Markierung reagieren. Dazu gibt es ein passendes Ereignis, das wir durch Setzen des Attributs <b>SelectionChanged <\/b>auf den Namen der auszuf&uuml;hrenden Ereignismethode aktivieren:<\/p>\n<pre>&lt;RichTextBox x:Name=\"rtb\" ... SelectionChanged=\"Rtb_SelectionChanged\"&gt;<\/pre>\n<p>Das <b>Selection<\/b>-Ereignis feuert mehrmals, wenn Sie beispielsweise mit der Maus einen Text markieren und dazu an einer Stelle die Maustaste herunterdr&uuml;cken und dann den Mauszeiger bis zum Ende der Markierung ziehen oder die Markierung mithilfe von Tastaturbefehlen erweitern. Daher geben wir den aktuell markierten Text im folgenden Beispiel in einem Textfeld aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Rtb_SelectionChanged(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>strSelection<span style=\"color:blue;\"> As String<\/span>\r\n     strSelection = rtb.Selection.Text\r\n     txt.Text = strSelection\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Text an Markierung einf&uuml;gen<\/b><\/p>\n<p>Die folgende Schaltfl&auml;che soll eine Methode aufrufen, die den Text aus dem Textfeld an der Stelle der aktuellen Markierung im <b>RichTextBox<\/b>-Steuerelement einf&uuml;gen soll:<\/p>\n<pre>&lt;Button x:Name=\"btnTextEinfuegen\" Click=\"BtnTextEinfuegen_Click\"&gt;Text an Markierung einf&uuml;gen:&lt;\/Button&gt;\r\n&lt;TextBox x:Name=\"txtEinfuegen\" Text=\"Einf&uuml;gen\"&gt;&lt;\/TextBox&gt;<\/pre>\n<p>Die dadurch aufgerufene Ereignismethode erledigt das durch Einstellen des mit <b>Selection.Text <\/b>ermittelten Bereichs auf den Inhalt des Textfeldes:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BtnTextEinfuegen_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>strText<span style=\"color:blue;\"> As String<\/span>\r\n     strText = txtEinfuegen.Text\r\n     rtb.Selection.Text = strText\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Kompletten Inhalt durch neuen Text ersetzen<\/b><\/p>\n<p>Wenn Sie den kompletten aktuellen Inhalt des <b>RichTextBox<\/b>-Steuerelements durch einen anderen Text ersetzen wollen, legen Sie den zu ersetzenden Teil mit einem <b>TextRange<\/b>-Element fest. Dieses f&uuml;ttern wir beim Initialisieren mit der Start- und der Endmarkierung des enthaltenen Dokuments und weisen dann der <b>Text<\/b>-Eigenschaft des <b>TextRange<\/b>-Objekts den einzusetzenden Text zu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BtnKomplettenTextErsetzen_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>objTextRange<span style=\"color:blue;\"> As <\/span>TextRange\r\n     <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n     strText = txtEinfuegen.Text\r\n     objTextRange = <span style=\"color:blue;\">New<\/span> TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd)\r\n     objTextRange.Text = strText\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\/55000204\/\">\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\/55000204?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\/55000204\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"fcbe9f97aa\"\/>\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>Die beiden Steuer-elemente TextBox und TextBlock reichen f&uuml;r die Darstellung einfacher Texte aus. Wenn die Texte jedoch formatiert oder sogar strukturiert dargestellt werden wollen, brauchen wir eine Alternative. Im Artikel &#8220;FlowDocument-Elemente mit XAML&#8221; haben Sie bereits das FlowDocument-Element kennen gelernt, das viele M&ouml;glichkeiten bietet einschlie&szlig;lich Abs&auml;tze, Inline-Formatierungen, Listen, Tabellen und Abbildungen. Nun wollen wir uns ansehen, wie uns das RichTextBox-Steuerelement dabei unterst&uuml;tzen kann, diese Art von Dokumenten zu bearbeiten.<\/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":[66012020,662020,44000021,44000027,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000204","post","type-post","status-publish","format-standard","hentry","category-66012020","category-662020","category-Entity_Framework","category-Excel_programmieren","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000204","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=55000204"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000204\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000204"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}