Änderungen aus RTB können nicht abgerufen werden

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Translating-IT.

    Änderungen aus RTB können nicht abgerufen werden

    Hallo,

    Ich bin Hobbyprogrammierer (meist nach der Arbeit, wenn ich dann noch Zeit hab und nicht zu müde bin) und ganz neu in WPF (ich habe vorher nur komplexere Weblösungen (aspx) mit VB.Net programmiert) und habe jetzt mit einiger Hilfestellung ein kleines Programm geschrieben, das Daten aus SQLite ausliest und in einem Datagrid mit Richtextboxen in 2 von 3 Spalten auflistet. Von den 3 Spalten kann der Benutzer die 2 mit den RTBs bearbeiten. Leider schaffe ich es seit Wochen nicht, diese Änderungen wieder auszulesen, um sie dann in SQLite zu speichern.

    Ich habe dazu in diversen englishsprachigen Foren einen Richtextboxhelper "vorgesetzt" bekommen, den ich teilweise umbauen musste, damit die Daten noch vor Anzeigen etwas formatiert werden. Dies greift, soweit ich es verstanden habe, direkt nachdem die RTB-Felder befüllt werden. Die ganzen Zusammenhänge verstehe ich leider noch nicht ganz.

    Nun möchte ich idealerweise beim Anklicken einer Schaltfläche die veränderten RTBs auslesen und in SQLite speichern. Leider kann ich nicht auf die Daten aus den RTBs zugreifen, im MS-Forum checken die einfach nicht, dass es RTBs und keine normalen Textboxes sind und die ganzen Lösungsvorschläge mit INotifyPropertyChanged und ObservableCollection funktionieren daher nicht.

    Alternativ hab ich mir überlegt die Daten über den Helper zu verarbeiten, wenn der Benutzer das Feld verlässt (lost focus), aber ich verstehe nicht ganz wie ich den Helper auslösen kann.

    Hier mal mein Code, vielleicht kann ja wer weiterhelfen:

    XAML:

    VB.NET-Quellcode

    1. <Window x:Class="Window1"
    2. xmlns="[url]http://schemas.microsoft.com/winfx/2006/xaml/presentation[/url]"
    3. xmlns:x="[url]http://schemas.microsoft.com/winfx/2006/xaml[/url]"
    4. xmlns:d="[url]http://schemas.microsoft.com/expression/blend/2008[/url]"
    5. xmlns:mc="[url]http://schemas.openxmlformats.org/markup-compatibility/2006[/url]"
    6. xmlns:local="clr-namespace:TMEdit"
    7. mc:Ignorable="d"
    8. Title="Window1" WindowState="Maximized" WindowStartupLocation="CenterScreen" d:DesignWidth="1412.668" d:DesignHeight="532.284">
    9. <Grid>
    10. <Grid.RowDefinitions>
    11. <RowDefinition Height="217*"/>
    12. <RowDefinition Height="284*"/>
    13. </Grid.RowDefinitions>
    14. <Button x:Name="Button1" Content="Hinzufügen" HorizontalAlignment="Left" Margin="26,53,0,0" VerticalAlignment="Top" Width="97" Visibility="visible"/>
    15. <DataGrid x:Name="DG1" Margin="10,124,10,10" ItemsSource="{Binding}" HorizontalContentAlignment="Stretch" AutoGenerateColumns="False" Grid.RowSpan="2" CanUserAddRows="False">
    16. <DataGrid.Columns>
    17. <DataGridTextColumn Header="Id" Binding="{Binding id}" Width="Auto"></DataGridTextColumn>
    18. <DataGridTemplateColumn Header="source_segment" Width="50*">
    19. <DataGridTemplateColumn.CellTemplate>
    20. <DataTemplate>
    21. <local:RichTextBoxHelper x:Name="rtb" VerticalScrollBarVisibility="Auto" keytoken ="13" TextValue="{Binding source_segment}">
    22. </local:RichTextBoxHelper>
    23. </DataTemplate>
    24. </DataGridTemplateColumn.CellTemplate>
    25. <DataGridTemplateColumn.CellStyle>
    26. <Style>
    27. <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
    28. </Style>
    29. </DataGridTemplateColumn.CellStyle>
    30. </DataGridTemplateColumn>
    31. <DataGridTemplateColumn Header="target_segment" Width="50*">
    32. <DataGridTemplateColumn.CellTemplate>
    33. <DataTemplate>
    34. <local:RichTextBoxHelper x:Name="rtb" VerticalScrollBarVisibility="Auto" keytoken ="11" TextValue="{Binding target_segment, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
    35. </local:RichTextBoxHelper>
    36. </DataTemplate>
    37. </DataGridTemplateColumn.CellTemplate>
    38. <DataGridTemplateColumn.CellStyle>
    39. <Style>
    40. <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
    41. </Style>
    42. </DataGridTemplateColumn.CellStyle>
    43. </DataGridTemplateColumn>
    44. </DataGrid.Columns>
    45. </DataGrid>
    46. <TextBox x:Name="TB1" HorizontalAlignment="Left" Height="23" Margin="183,11,0,0" TextWrapping="Wrap" Text="Suchtext für Ausgangstext" LostKeyboardFocus="TextBox_LostKeyboardFocus" GotKeyboardFocus="TextBox_GotKeyboardFocus" KeyUp="TextBox_KeyUp" VerticalAlignment="Top" Width="341" Visibility="visible"/>
    47. <TextBox x:Name="TB2" HorizontalAlignment="Left" Height="23" Margin="183,46,0,0" TextWrapping="Wrap" Text="Suchtext für Zieltext" LostKeyboardFocus="TextBox_LostKeyboardFocus" GotKeyboardFocus="TextBox_GotKeyboardFocus" KeyUp="TextBox_KeyUp" VerticalAlignment="Top" Width="342" Visibility="visible"/>
    48. <TextBox x:Name="TB3" HorizontalAlignment="Left" Height="23" Margin="894,46,0,0" TextWrapping="Wrap" Text="Ersetzen durch" LostKeyboardFocus="TextBox_LostKeyboardFocus" GotKeyboardFocus="TextBox_GotKeyboardFocus" KeyUp="TextBox_KeyUp" VerticalAlignment="Top" Width="342" Visibility="visible"/>
    49. <RadioButton x:Name="RB1" Content="Ausgangstext" GroupName="1" HorizontalAlignment="Left" Margin="790,34,0,0" VerticalAlignment="Top" Visibility="visible"/>
    50. <RadioButton x:Name="RB2" Content="Zieltext" GroupName="1" HorizontalAlignment="Left" Margin="790,54,0,0" VerticalAlignment="Top" Visibility="visible"/>
    51. <RadioButton x:Name="RB3" Content="Text automatisch ersetzen" GroupName="2" HorizontalAlignment="Left" Margin="10,8,0,0" VerticalAlignment="Top"/>
    52. <RadioButton x:Name="RB4" Content="Segmente suchen" GroupName="2" HorizontalAlignment="Left" Margin="10,30,0,0" VerticalAlignment="Top"/>
    53. <!--<CheckBox x:Name="CB4" Content="Regex (C# .NET Core)" HorizontalAlignment="Left" Margin="1260,10,0,0" VerticalAlignment="Top" Visibility="visible"/>-->
    54. <!--<CheckBox x:Name="CB5" Content="Groß-/Kleinschreibung" HorizontalAlignment="Left" Margin="1260,33,0,0" VerticalAlignment="Top" Visibility="visible"/>-->
    55. <!--<CheckBox x:Name="CB6" Content="Ganze Wörter" HorizontalAlignment="Left" Margin="1260,56,0,0" VerticalAlignment="Top" Visibility="visible"/>-->
    56. <CheckBox x:Name="CB1" Content="Regex (C# .NET Core)" HorizontalAlignment="Left" Margin="540,8,0,0" VerticalAlignment="Top" Visibility="Hidden"/>
    57. <CheckBox x:Name="CB2" Content="Groß-/Kleinschreibung" HorizontalAlignment="Left" Margin="540,31,0,0" VerticalAlignment="Top" Visibility="visible"/>
    58. <CheckBox x:Name="CB3" Content="Ganze Wörter" HorizontalAlignment="Left" Margin="540,54,0,0" VerticalAlignment="Top" Visibility="visible"/>
    59. <Label x:Name="Lbl1" Content="Ersetzen in:" HorizontalAlignment="Left" Margin="787,3,0,0" VerticalAlignment="Top" Visibility="visible"/>
    60. <Label x:Name="Lbl2" Content="Zeilen/Seite" HorizontalAlignment="Left" Margin="703,3,0,0" VerticalAlignment="Top" Visibility="visible"/>
    61. <ComboBox x:Name="CoB1" HorizontalAlignment="Left" Margin="707,36,0,0" VerticalAlignment="Top" Width="50" Visibility="visible">
    62. <ComboBoxItem>10</ComboBoxItem>
    63. <ComboBoxItem IsSelected="True">25</ComboBoxItem>
    64. <ComboBoxItem>50</ComboBoxItem>
    65. <ComboBoxItem>75</ComboBoxItem>
    66. <ComboBoxItem>100</ComboBoxItem>
    67. <ComboBoxItem>250</ComboBoxItem>
    68. <ComboBoxItem>500</ComboBoxItem>
    69. <ComboBoxItem>750</ComboBoxItem>
    70. <ComboBoxItem>1000</ComboBoxItem>
    71. <ComboBoxItem>Alle</ComboBoxItem>
    72. </ComboBox>
    73. <Separator Height="100" Margin="0,34,0,0" VerticalAlignment="Top"/>
    74. <Grid Margin="419,90,386,95" HorizontalAlignment="Center" Width="600" >
    75. <Grid.ColumnDefinitions>
    76. <ColumnDefinition Width="Auto">
    77. </ColumnDefinition>
    78. <ColumnDefinition Width="100"/>
    79. <ColumnDefinition Width="100">
    80. </ColumnDefinition>
    81. <ColumnDefinition Width="100">
    82. </ColumnDefinition>
    83. <ColumnDefinition Width="100"/>
    84. <ColumnDefinition Width="100"/>
    85. <ColumnDefinition Width="100">
    86. </ColumnDefinition>
    87. </Grid.ColumnDefinitions>
    88. <Button x:Name="Btn_erst" Grid.Column="1" Content="|&lt;&lt;" HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Top" Width="76" Visibility="visible" Height="20"/>
    89. <Button x:Name="Btn_zur" Grid.Column="2" Content="&lt;" HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Top" Width="76" Visibility="visible" Height="20"/>
    90. <TextBox x:Name="TB4" Grid.Column="3" HorizontalAlignment="right" Height="23" Margin="0,0,0,0" BorderThickness="1" TextAlignment="Center" Text="x" VerticalAlignment="Top" Width="50" Visibility="visible" />
    91. <Label x:Name="Lbl3" Grid.Column="4" Content="von x" HorizontalAlignment="left" Margin="0,-3,0,0" VerticalAlignment="Top" Visibility="visible" Width="50" HorizontalContentAlignment="Center" Height="24"/>
    92. <Button x:Name="Btn_weiter" Grid.Column="5" Content="&gt;" HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Top" Width="76" Visibility="visible" Height="20"/>
    93. <Button x:Name="Btn_letzte" Grid.Column="6" Content="&gt;&gt;|" HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Top" Width="76" RenderTransformOrigin="4.054,0.197" Visibility="visible" Height="20"/>
    94. </Grid>
    95. <ComboBox x:Name="CoB2" HorizontalAlignment="Left" Margin="1256,20,0,0" VerticalAlignment="Top" Width="120" Visibility="Hidden" />
    96. <Button x:Name="Btn_send" Content="Abschicken" HorizontalAlignment="Left" Margin="1256,58,0,0" VerticalAlignment="Top" Width="75" Visibility="Visible" RenderTransformOrigin="-0.646,1.173" />
    97. <Label x:Name="Lbl4" Content="Sprache wählen:" HorizontalAlignment="Left" Margin="1256,-6,0,0" VerticalAlignment="Top" Width="120" Visibility="Hidden"/>
    98. </Grid>
    99. </Window>


    codebehind:

    Helper:

    VB.NET-Quellcode

    1. Public Class RichTextBoxHelper
    2. Inherits RichTextBox
    3. Private Shared _keytoken As String
    4. Public Property keytoken As String
    5. Get
    6. Return _keytoken
    7. End Get
    8. Set(ByVal value As String)
    9. _keytoken = value
    10. End Set
    11. End Property
    12. Public Property TextValue As String
    13. Get
    14. Return CStr(GetValue(TextValueProperty))
    15. End Get
    16. Set(ByVal value As String)
    17. SetValue(TextValueProperty, value)
    18. End Set
    19. End Property
    20. Public Shared ReadOnly TextValueProperty As DependencyProperty = DependencyProperty.Register("TextValue", GetType(String), GetType(RichTextBoxHelper), New FrameworkPropertyMetadata("", New PropertyChangedCallback(AddressOf FinalValueChanged)))
    21. Private Shared Sub FinalValueChanged(ByVal obj As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
    22. Dim newvalue As String = CStr(e.NewValue)
    23. Dim textBox As RichTextBox = CType(obj, RichTextBox)
    24. If e.NewValue IsNot Nothing Then
    25. textBox.Document.Blocks.Clear()
    26. textBox.Document.Blocks.Add(New Paragraph(New Run(e.NewValue.ToString())))
    27. Dim wordRanges As IEnumerable(Of TextRange) = GetAllWordRanges(textBox.Document)
    28. For x = 1 To count
    29. Dim numberpattern As String = "{t" & x & "}"
    30. matches = Regex.Matches(textBox.Document.ToString, numberpattern)
    31. For Each wordRange As TextRange In wordRanges
    32. If _keytoken IsNot Nothing Then
    33. If wordRange.Text = "{t" & x & "}" Then
    34. 'wordRange.Text = ""
    35. wordRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Purple)
    36. wordRange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold)
    37. End If
    38. If wordRange.Text = "{s" & x & "}" Then
    39. If (dic_suche.ContainsKey("{s" & x & "}")) Then
    40. str_tag = dic_suche.Item("{s" & x & "}")
    41. End If
    42. wordRange.Text = str_tag
    43. wordRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Red)
    44. wordRange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold)
    45. 'wordRange.ClearAllProperties()
    46. End If
    47. End If
    48. Next
    49. Next
    50. End If
    51. End Sub
    52. Public Shared Iterator Function GetAllWordRanges(ByVal document As FlowDocument) As IEnumerable(Of TextRange)
    53. Dim numberpattern As String = "{(s|t)\d+}"
    54. Dim pointer As TextPointer = document.ContentStart
    55. While pointer IsNot Nothing
    56. If pointer.GetPointerContext(LogicalDirection.Forward) = TextPointerContext.Text Then
    57. Dim textRun As String = pointer.GetTextInRun(LogicalDirection.Forward)
    58. Dim matches As MatchCollection = Regex.Matches(textRun, numberpattern)
    59. For Each match As Match In matches
    60. 'dic_result.Add(match.ToString, "{te}")
    61. Dim startIndex As Integer = match.Index
    62. Dim length As Integer = match.Length
    63. Dim start As TextPointer = pointer.GetPositionAtOffset(startIndex)
    64. Dim [end] As TextPointer = start.GetPositionAtOffset(length)
    65. Yield New TextRange(start, [end])
    66. Next
    67. End If
    68. pointer = pointer.GetNextContextPosition(LogicalDirection.Forward)
    69. End While
    70. End Function
    71. Public Shared Function GetText(ByVal document As FlowDocument) As String
    72. Return New TextRange(document.ContentStart, document.ContentEnd).Text
    73. End Function
    74. End Class


    Befüllen des Datagrids über DataTable:

    VB.NET-Quellcode

    1. 'viel Code zum auslesen aus SQLite und Verarbeiten
    2. dt.Rows.Add(str_id.ToString, str_source.ToString, str_target.ToString)
    3. DG1.ItemsSource = dt.DefaultView


    Solltet Ihr noch etwas zusätzlichen Code zum besseren Nachvollziehen benötigen, bitte melden.



    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Translating-IT schrieb:

    und die ganzen Lösungsvorschläge mit INotifyPropertyChanged und ObservableCollection funktionieren daher nicht.

    Das ist richtig. das liegt daran (wie du richtig erkannt hast) das die RTB im Gegensatz zur normalen textBox kein Text Property als DependencyProperty implementiert hat da bei einer RTB alles mit Paragraphen gemacht wird.

    Ich hatte selbst einen ähnlichen Fall in welchem ich trotzdem mit Binding arbeiten wollte (so wie es sich in der WPF gehört, denn CodeBehind ist nicht gut unter WPF).

    Die RTB vom Xceed Toolkit ist meiner Meinung nach genau das was du suchst. Vorallem da diese dem User auch möglichkeiten der Formatierung mitgbringt.
    Durch Intergrierte Formatter (auch custom Formatter sind möglich mit nur ein paar Zeilen code) ist auch das wieder zurückspielen der Daten inkl. aller Formattierungsinfos problemlos möglich.

    Der Helper ist nicht so das wahre, wenn schon selbst machen würde ich ein AttachedProperty erstellen welches ein Text Property als DependencyProperty zur verfügung stellt. Über das TextChanged Event kannst du dann mit SetValue aus der Basisklasse DependecyObject kannst dein Property dann füllen anhand deiner Hilfsmethoden wie z.b. GetallWordReanges.

    Falls du hier unterstützung benötigst kannst du dich ja gerne nochamls melden, aber ich denke die Doku ist selbsterklärend.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Hallo Sascha,

    xceed hatte ich schon gesehen, aber ist das in meinem Fall nicht hinfällig, da nur die teure Plus-Version Datagrid unterstützt? Ich benötige ja mehrere (unbekannte Anzahl von) RTBs (2 je Reihe) pro Datagrid.

    Edit: wie bekomm ich Toolkit in XAML rein?

    ich wollte von

    VB.NET-Quellcode

    1. <local:RichTextBoxHelper x:Name="rtb" VerticalScrollBarVisibility="Auto" keytoken ="13" TextValue="{Binding source_segment}">
    2. </local:RichTextBoxHelper>


    "<local:RichTextBoxHelper" mit "<toolkit:RichTextBox" ersetzen, aber ich erhalte die Fehlermeldung:

    Fehler XLS0414 Typ 'toolkit:RichTextBox' wurde nicht gefunden. Stellen Sie sicher, dass keine Assemblyreferenz fehlt, und dass alle referenzierten Assemblys erstellt wurden. TMEdit Window1.xaml 34


    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Translating-IT“ ()

    Translating-IT schrieb:

    da nur die teure Plus-Version Datagrid unterstützt?

    Du brauchst das DataGrid ja nicht. Lediglich die RTB von Xceed wird benötigt, da ja jedes Control in das "Originale" DataGrid gepackt werden kann. Also auch die RTB von XCeed.

    Translating-IT schrieb:

    wie bekomm ich Toolkit in XAML rein?

    Vermutlich fehlt dir der Import.

    XML-Quellcode

    1. xmlns:toolkit="http://schemas.xceed.com/wpf/xaml/toolkit"


    Guck mal hier: github.com/xceedsoftware/wpftoolkit/wiki

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo

    Mir ist gerade eingefallen das ich da ein ältere Projekt habe wo ich sowas mit einer Richtextbox mit Binding an ein ViewModel gemacht habe welches auch Online ist.

    Hier die View: github.com/NoFear23m/Complianc…ghlightedRichtextbox.xaml
    Das ViewModel: github.com/NoFear23m/Complianc…iewModel/HistoryItemVM.vb

    Hier ein Beispiel wo das UserControl eingebunden wurde: github.com/NoFear23m/Complianc…clAddEditHistoryItem.xaml

    Kannste abgucken =O

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Lediglich die RTB von Xceed wird benötigt, da ja jedes Control in das "Originale" DataGrid gepackt werden kann. Also auch die RTB von XCeed.


    aso … Gedankenfehler. Ich dachte, es würde dann erst alles in Gridview unterstützen.


    Vermutlich fehlt dir der Import.


    :cursing: :saint: Wie kommst denn darauf …? An das hab ich überhaupt nicht gedacht.

    Mir ist gerade eingefallen das ich da ein ältere Projekt habe wo ich sowas mit einer Richtextbox mit Binding an ein ViewModel gemacht habe welches auch Online ist.


    Danke. Werd ich mir bei Gelegenheit mal anschauen.

    Edit:

    Hab nur mal schnell probiert. Am Abend hab ich evtl. etwas mehr Zeit:

    Eingebunden: Die Werte aus SQLite werden schon mal übernommen, aber ich sehe das es Probleme mit Sonderzeichen (ü, è, geschützte Leerzeichen usw.) gibt. Diese werden alle nur als "?" angezeigt. Wie kann ich das umgehen?

    Die vom Benutzer vorgenommenen Änderungen werden auch in Codebehind übernommen. Da muss ich dann nur aufpassen, weil bei Änderungen Code hinzugefügt wird. Den muss ich dann wieder entfernen, sonst gibt es nachher Probs mit der Datenbank.

    Die Formatierungsbearbeitung, welche im RichTextBoxHelper vorgenommen wurde, muss ich auch noch eruieren, wo und wie ich die nun umsetzen muss.

    Edit2: Fehler in Aussage oben korrigiert

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Translating-IT“ ()

    Hallo Sascha,

    Die Sonderzeichen und das mit dem hinzugefügten Code bei Änderungen hab ich auch lösen können. Dazu musste ich in XAML Folgendes einbinden:

    VB.NET-Quellcode

    1. <toolkit:RichTextBox.TextFormatter>
    2. <toolkit:PlainTextFormatter />
    3. </toolkit:RichTextBox.TextFormatter>


    Ich wollte auch versuchen einen eigenen Formatter zu erstellen, um die Daten im Codebehind zu formatieren sobald sie geladen sind (ist das eh kein Gedankenfehler?), damit bestimmte Textstellen farblich und fett hervorgehoben werden. Da hab ich aber nach dem Convertieren von C# in VB jetzt 2 Fehlermeldungen:

    VB.NET-Quellcode

    1. Public Class MyFormatter
    2. Inherits ITextFormatter
    3. Public Function GetText(ByVal document As FlowDocument) As String
    4. Return New TextRange(document.ContentStart, document.ContentEnd).Text
    5. End Function
    6. Public Sub SetText(ByVal document As FlowDocument, ByVal text As String)
    7. New TextRange(document.ContentStart, document.ContentEnd).Text = text
    8. End Sub
    9. End Class


    Fehler 1:
    Ich kann ITextFormatter nicht erben. Es wird zwar als Interface von xceed erkannt, aber ich erhalte die Meldung:
    Klassen können nur von anderen Klassen erben.

    Fehler 2:
    Syntaxfehler bei New in "New TextRange(document.ContentStart, document.ContentEnd).Text = text"

    Was hat der Converter da "vergessen"? Ich sitz grad auf der Leitung.

    Edit:
    kann ich meinen Helper von vor xceed nicht für die Formatierung verwenden, indem ich ihn etwas anpasse?

    Hinweis: Der Benutzer kann und soll den Text nicht formatieren können, nur Textstellen bei Bedarf hinzufügen, ändern oder löschen können.

    Diese Warnung bekomme ich auch seit der Installation des Pakets angezeigt:

    Warnung NU1701 Das Paket "Extended.Wpf.Toolkit 3.5.0" wurde nicht mit dem Projektzielframework ".NETCoreApp,Version=v2.1", sondern mit ".NETFramework,Version=v4.6.1" wiederhergestellt. Dieses Paket ist mit Ihrem Projekt möglicherweise nicht vollständig kompatibel. EditBibliothek C:\Z\übprog\TMEdit\EditBibliothek\EditBibliothek.vbproj 1

    Sollte ich diesbezüglich etwas ändern?

    Grüße,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Translating-IT“ ()

    Translating-IT schrieb:

    Ich wollte auch versuchen einen eigenen Formatter zu erstellen, um die Daten im Codebehind zu formatieren sobald sie geladen sind (ist das eh kein Gedankenfehler?), damit bestimmte Textstellen farblich und fett hervorgehoben werden. Da hab ich aber nach dem Convertieren von C# in VB jetzt 2 Fehlermeldungen

    OK, nicht böse sein, aber vergiss das mit dem eigenen Formatter. Ist nicht so einfach. ITextFormatter ist keine Basisklasse sondern ein Interface. Das muss implementiert werden.
    Und die ist ja auch nicht im codeBehind sondern eine eigene Klasse.

    Translating-IT schrieb:

    kann ich meinen Helper von vor xceed nicht für die Formatierung verwenden, indem ich ihn etwas anpasse?

    Sicher kannst du den anpassen. Ist eben Tricky. Hier z.b. der RtbFormatter von XCeed:
    github.com/xceedsoftware/wpfto…ormatters/RtfFormatter.cs

    Translating-IT schrieb:

    Diese Warnung bekomme ich auch seit der Installation des Pakets angezeigt

    Und was ist EditBobliothek für ein Projekt. Vermutlich keine WPF Anwendung. Warum willst du dort dann die XCeed Coxntrols einbinden? Ist vermutlich eine .Net Core Klassenbiliothek.

    Nimm den RtfFormatter und verändere den PlainText vor dem zurückschreiben wenn du unbedingt etwas Formattieren willst. Die Richtextbox ist ein ganz eigenes Control, wenn man mit dieser was machen will sollte man sich gut überlegen was man da machen will da diese eine ganz eigene Formattierung mitbringt, ist alles nicht so einfach.

    Aber ich würde gerne zum eigentlichen Problem zurück. Klappt das simple Binding auf das Text Property nun?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,

    OK, nicht böse sein, aber vergiss das mit dem eigenen Formatter.


    Nein, kein Problem. Mit eigenem Formatter hatte ich eigentlich eine Abwandlung der Beispiele in der Wiki von xceed gemeint.

    Ist eben Tricky. Hier z.b. der RtbFormatter von XCeed:


    da bekomm ich auch wieder den Fehler mit dem ITextFormatter

    Ist vermutlich eine .Net Core Klassenbiliothek.


    Ok, wollte nur sichergehen.

    Aber ich würde gerne zum eigentlichen Problem zurück. Klappt das simple Binding auf das Text Property nun?


    Stimmt. Sorry. Ja, der Zugriff in beide Richtungen funktioniert nun, wie oben schon geschrieben.
    Dazu habe ich das Binding so gesetzt:

    VB.NET-Quellcode

    1. Text="{Binding target_segment, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"


    Entsprechend werde ich den Thread mal schließen und die anderen Fragen in einem neuen stellen, sind ja so gesehen neue Fragen, die sich erst aus der erfolgreichen Implementierung ergeben haben.

    Grüße,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Translating-IT schrieb:

    da bekomm ich auch wieder den Fehler mit dem ITextFormatter

    Wechen Fehler genau!

    Wichtig ist statt Inherits ITextFormatter muss Implements ITextFormatter und die Mathoden müssen denen des Interfaces entsprechen.

    Am einfachsten ist es du legst eine Klasse an. und schreibst unter den Klassennamen Implements ITextFormatter. Das wird dann rot unterstrichen da es erstmal einen Import benötigt. Das schlägt dir Visual Studio aber eh vor. Dann am ende der Zeile Enter drücken und die beiden Methoden welche benötigt werden, werden dir von der IDE automatisch hinzugefügt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Wichtig ist statt Inherits ITextFormatter muss Implements ITextFormatter und die Mathoden müssen denen des Interfaces entsprechen.


    deppertes implements … coverter hat inherits gelassen. Hab keine richtige Fehlermeldung bzw. Lösungsvorschläge angezeigt bekommen. Nachdem implements drinnen war, kamen auch Vorschläge. Darauf muss ich in Zukunft wohl etwas besser aufpassen.

    So, werd mal versuchen selber weiter zu basteln.

    Danke erstmal für die Hilfe.

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.