Get und Set einer RTB (xceed) bei Änderung auslösen?

  • WPF

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

    Get und Set einer RTB (xceed) bei Änderung auslösen?

    Hallo,

    Bin noch sehr neu in WPF …

    Kann ich Get und Set einer RTB (xceed) bei Änderung oder Erstbefüllung (wenn das Binding befüllt wird) der RTBs auslösen?

    Erstbefüllung, hab ich schon mitbekommen, dass es geht, aber durch welchen Befehl wird das ausgelöst?

    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.
    Guten Morgen

    Ich kann dir nicht ganz folgen was hier die Fragestellung genau bedeutet.

    Wenn du Binding auf das Text Property hast dann hast du ja eh einen Getter und einen Setter, setzte einen Haltepunkt und du wirst sehen er läuft dort hinein.

    Oder was meinst du?

    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,

    Ich glaub das liegt mit dem depperten MS-Forum zusammen. Die haben mir vor Wochen ein so umständliches Werk zusammenstellen geholfen, bei dem ich fast nix versteh. Auch nicht, wie es ausgelöst wird. Es hat nur beim Befüllen ausgelöst, danach war kein Zugriff mehr möglich (siehe mein Thread wegen Zugriff auf RTBs). Das war an sich kein Problem, da ich eh nur beim Befüllen ein paar Strings umformatieren musste.

    Ich wollte nun versuchen, die Logik für die Formatierung bestimmter Strings ({s\d+} bzw. {t\d+}) in die xceed RTBs einzubinden.

    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:

    Ich wollte nun versuchen, die Logik für die Formatierung bestimmter Strings ({s\d+} bzw. {t\d+}) in die xceed RTBs einzubinden.

    Dafür wäre je im Grunde der Formatter zuständig.

    Zeige dein aktuelles(!!) Binding. Du hast ja (hoffe ich) eine Klasse an die dein Vies (XAML) gebunden ist.
    du hast die RTBs ja in einem DataGrid. Jeder zeile dieses DataGrid (Row) entspricht ja wieder einer Instanz einer Klasse. Und dort gibt es das Property an welches du die Text-Eigenschaft der RTB gebunden hast.
    Und dieses Property hat einen Getter und einen Setter. Und genau dort kannst du ansetzen.

    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,

    Binding:

    XAML:
    Spoiler anzeigen

    XML-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:toolkit="[url]http://schemas.xceed.com/wpf/xaml/toolkit[/url]"
    7. xmlns:local="clr-namespace:TMEdit"
    8. mc:Ignorable="d"
    9. Title="Window1" WindowState="Maximized" WindowStartupLocation="CenterScreen" d:DesignWidth="1412.668" d:DesignHeight="532.284">
    10. <Grid>
    11. <Grid.RowDefinitions>
    12. <RowDefinition Height="217*"/>
    13. <RowDefinition Height="284*"/>
    14. </Grid.RowDefinitions>
    15. <Button x:Name="Button1" Content="Hinzufügen" HorizontalAlignment="Left" Margin="26,53,0,0" VerticalAlignment="Top" Width="97" Visibility="visible"/>
    16. <DataGrid x:Name="DG1" Margin="10,124,10,10" ItemsSource="{Binding}" HorizontalContentAlignment="Stretch" AutoGenerateColumns="False" Grid.RowSpan="2" CanUserAddRows="False">
    17. <DataGrid.Columns>
    18. <DataGridTextColumn Header="Id" Binding="{Binding id}" Width="Auto"></DataGridTextColumn>
    19. <DataGridTemplateColumn Header="source_segment" Width="50*">
    20. <DataGridTemplateColumn.CellTemplate>
    21. <DataTemplate>
    22. <toolkit:RichTextBox x:Name="rtb" VerticalScrollBarVisibility="Auto" Text="{Binding source_segment, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
    23. <!--<toolkit:RichTextBox.TextFormatter>
    24. <myCustomFormatter:MyFormatter />
    25. </toolkit:RichTextBox.TextFormatter>-->
    26. <toolkit:RichTextBox.TextFormatter>
    27. <toolkit:PlainTextFormatter />
    28. </toolkit:RichTextBox.TextFormatter>
    29. </toolkit:RichTextBox>
    30. <!--<local:RichTextBoxHelper x:Name="rtb" VerticalScrollBarVisibility="Auto" keytoken ="13" TextValue="{Binding source_segment}">
    31. </local:RichTextBoxHelper>-->
    32. </DataTemplate>
    33. </DataGridTemplateColumn.CellTemplate>
    34. <DataGridTemplateColumn.CellStyle>
    35. <Style>
    36. <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
    37. </Style>
    38. </DataGridTemplateColumn.CellStyle>
    39. </DataGridTemplateColumn>
    40. <DataGridTemplateColumn Header="target_segment" Width="50*">
    41. <DataGridTemplateColumn.CellTemplate>
    42. <DataTemplate>
    43. <toolkit:RichTextBox x:Name="rtb" VerticalScrollBarVisibility="Auto" Text="{Binding target_segment, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
    44. <toolkit:RichTextBox.TextFormatter>
    45. <toolkit:PlainTextFormatter />
    46. </toolkit:RichTextBox.TextFormatter>
    47. </toolkit:RichTextBox>
    48. <!--<local:RichTextBoxHelper x:Name="rtb" VerticalScrollBarVisibility="Auto" keytoken ="11" TextValue="{Binding target_segment}">
    49. </local:RichTextBoxHelper>-->
    50. </DataTemplate>
    51. </DataGridTemplateColumn.CellTemplate>
    52. <DataGridTemplateColumn.CellStyle>
    53. <Style>
    54. <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
    55. </Style>
    56. </DataGridTemplateColumn.CellStyle>
    57. </DataGridTemplateColumn>
    58. </DataGrid.Columns>
    59. </DataGrid>
    60. <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"/>
    61. <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"/>
    62. <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"/>
    63. <RadioButton x:Name="RB1" Content="Ausgangstext" GroupName="1" HorizontalAlignment="Left" Margin="790,34,0,0" VerticalAlignment="Top" Visibility="visible"/>
    64. <RadioButton x:Name="RB2" Content="Zieltext" GroupName="1" HorizontalAlignment="Left" Margin="790,54,0,0" VerticalAlignment="Top" Visibility="visible"/>
    65. <RadioButton x:Name="RB3" Content="Text automatisch ersetzen" GroupName="2" HorizontalAlignment="Left" Margin="10,8,0,0" VerticalAlignment="Top"/>
    66. <RadioButton x:Name="RB4" Content="Segmente suchen" GroupName="2" HorizontalAlignment="Left" Margin="10,30,0,0" VerticalAlignment="Top"/>
    67. <!--<CheckBox x:Name="CB4" Content="Regex (C# .NET Core)" HorizontalAlignment="Left" Margin="1260,10,0,0" VerticalAlignment="Top" Visibility="visible"/>-->
    68. <!--<CheckBox x:Name="CB5" Content="Groß-/Kleinschreibung" HorizontalAlignment="Left" Margin="1260,33,0,0" VerticalAlignment="Top" Visibility="visible"/>-->
    69. <!--<CheckBox x:Name="CB6" Content="Ganze Wörter" HorizontalAlignment="Left" Margin="1260,56,0,0" VerticalAlignment="Top" Visibility="visible"/>-->
    70. <CheckBox x:Name="CB1" Content="Regex (C# .NET Core)" HorizontalAlignment="Left" Margin="540,8,0,0" VerticalAlignment="Top" Visibility="Hidden"/>
    71. <CheckBox x:Name="CB2" Content="Groß-/Kleinschreibung" HorizontalAlignment="Left" Margin="540,31,0,0" VerticalAlignment="Top" Visibility="visible"/>
    72. <CheckBox x:Name="CB3" Content="Ganze Wörter" HorizontalAlignment="Left" Margin="540,54,0,0" VerticalAlignment="Top" Visibility="visible"/>
    73. <Label x:Name="Lbl1" Content="Ersetzen in:" HorizontalAlignment="Left" Margin="787,3,0,0" VerticalAlignment="Top" Visibility="visible"/>
    74. <Label x:Name="Lbl2" Content="Zeilen/Seite" HorizontalAlignment="Left" Margin="703,3,0,0" VerticalAlignment="Top" Visibility="visible"/>
    75. <ComboBox x:Name="CoB1" HorizontalAlignment="Left" Margin="707,36,0,0" VerticalAlignment="Top" Width="50" Visibility="visible">
    76. <ComboBoxItem>10</ComboBoxItem>
    77. <ComboBoxItem IsSelected="True">25</ComboBoxItem>
    78. <ComboBoxItem>50</ComboBoxItem>
    79. <ComboBoxItem>75</ComboBoxItem>
    80. <ComboBoxItem>100</ComboBoxItem>
    81. <ComboBoxItem>250</ComboBoxItem>
    82. <ComboBoxItem>500</ComboBoxItem>
    83. <ComboBoxItem>750</ComboBoxItem>
    84. <ComboBoxItem>1000</ComboBoxItem>
    85. <ComboBoxItem>Alle</ComboBoxItem>
    86. </ComboBox>
    87. <Separator Height="100" Margin="0,34,0,0" VerticalAlignment="Top"/>
    88. <Grid Margin="419,90,386,95" HorizontalAlignment="Center" Width="600" >
    89. <Grid.ColumnDefinitions>
    90. <ColumnDefinition Width="Auto">
    91. </ColumnDefinition>
    92. <ColumnDefinition Width="100"/>
    93. <ColumnDefinition Width="100">
    94. </ColumnDefinition>
    95. <ColumnDefinition Width="100">
    96. </ColumnDefinition>
    97. <ColumnDefinition Width="100"/>
    98. <ColumnDefinition Width="100"/>
    99. <ColumnDefinition Width="100">
    100. </ColumnDefinition>
    101. </Grid.ColumnDefinitions>
    102. <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"/>
    103. <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"/>
    104. <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" />
    105. <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"/>
    106. <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"/>
    107. <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"/>
    108. </Grid>
    109. <ComboBox x:Name="CoB2" HorizontalAlignment="Left" Margin="1256,20,0,0" VerticalAlignment="Top" Width="120" Visibility="Hidden" />
    110. <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" />
    111. <Label x:Name="Lbl4" Content="Sprache wählen:" HorizontalAlignment="Left" Margin="1256,-6,0,0" VerticalAlignment="Top" Width="120" Visibility="Hidden"/>
    112. </Grid>
    113. </Window>


    im Codebehind: (innerhalb einer Klasse)

    VB.NET-Quellcode

    1. DG1.ItemsSource = dt.DefaultView


    Mehr hab ich noch nicht wirklich: (das hier hab ich bisher mal zusammengewürfelt, aber war wie die Frage zeigt etwas verwirrt)

    VB.NET-Quellcode

    1. Namespace Xceed.Wpf.Toolkit
    2. Public Class RtfFormatter
    3. Implements ITextFormatter
    4. Public Function ITF_GetText(ByVal document As FlowDocument) As String Implements ITextFormatter.GetText
    5. Dim tr As TextRange = New TextRange(document.ContentStart, document.ContentEnd)
    6. Using ms As MemoryStream = New MemoryStream()
    7. tr.Save(ms, DataFormats.Rtf)
    8. Return ASCIIEncoding.[Default].GetString(ms.ToArray())
    9. End Using
    10. End Function
    11. Public Sub ITF_SetText(ByVal document As FlowDocument, ByVal text As String) Implements ITextFormatter.SetText
    12. Try
    13. If String.IsNullOrEmpty(text) Then
    14. document.Blocks.Clear()
    15. Else
    16. Dim tr As TextRange = New TextRange(document.ContentStart, document.ContentEnd)
    17. Using ms As MemoryStream = New MemoryStream(Encoding.ASCII.GetBytes(text))
    18. tr.Load(ms, DataFormats.Rtf)
    19. End Using
    20. End If
    21. Catch
    22. Throw New InvalidDataException("Data provided is not in the correct RTF format.")
    23. End Try
    24. End Sub
    25. End Class
    26. End Namespace


    Bin ich damit auf dem richtigen Weg? Ich hab nur noch keine Ahnung wie ich da jetzt weiter machen soll.

    Lg,
    Pascal

    *Richtige CodeTags und Spoiler gesetzt* ~NoFear23m
    :!: 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 „Nofear23m“ ()

    Hallo

    Naja, von Binding sehe ich hier nicht viel. DG1.ItemsSource = dt.DefaultView hat schon mal nix mit Binding zu tun. Aber gut. Das ist bis hierher nicht ganz so schlimm.

    Was mich nur interessiert hat (das war auf meine Frage im letztn Post) sind Properties wie target_segment und source_segment. Hier vollziehst du ja ein Binding. Aber du hast die Klasse mit diesen Properties nicht gepostet.

    Ich glaube du findest dich noch nicht ganz zurecht mit dem Thema WPF. Nicht so schlimm, dafür gibt es ja dieses Forum. Aber wie Binding funktioniert solltest du dir ansehen. Siehe hierzu meine Signatur.

    Also, Poste mal die betreffende Klasse. Oder noch viel besser.
    Wie wäre es wenn du ein Beispielprojekt machst wo dein Problem klarer wird und evtl. ne Aufgabenstellung. Denn..... Du schreibst du willst an dem Text was verändern. In wie fern verändern. Text ansich oder die Textfarbe oder was?

    btw: Warum implementierst du einen RTF-Formatter wenn es den bereits von XCeed gibt. Ist ja doppelt gemoppelt.

    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,

    Binding ist doch im XAML und wird soweit ich das verstanden habe, über die DG1…-Zeile mit den Daten aus Codebehind verbunden. Aber laut Deiner Aussage, habe ich da etwas falsch verstanden. ;)

    Was mich nur interessiert hat (das war auf meine Frage im letzten Post) sind Properties wie target_segment und source_segment.


    Du meinst, wie ich die Spalten aus der DB in die RTBs im Datagrid bekomme?

    Wirklich nur mit dieser einen Zeile über ein Datatable, der Rest passiert "automatisch".

    So befülle ich die Datatable für das Datagrid:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'auslesen aus SQLite …
    2. If boo_rb4checked = True Then 'Anzeigen
    3. count_rows += 1
    4. str_id = rdr.Item("id")
    5. str_source = rdr.Item("source_segment")
    6. str_target = rdr.Item("target_segment")
    7. str_source = str_source.Replace("<Text><Value>", "")
    8. str_source = str_source.Replace("</Value></Text>", "")
    9. str_source = str_source.Replace("<Segment xmlns:xsi=""[url][url]http://www.w3.org/2001/XMLSchema-instance[/url[/url]]"" xmlns:xsd=""[url][url]http://www.w3.org/2001/XMLSchema[/url[/url]]""><Elements>", "")
    10. If count_rows = 1 Then
    11. matches = Regex.Matches(str_source, "<CultureName>[a-z]{2}-[A-Z]{2}</CultureName>")
    12. For Each m As Match In matches
    13. str_source_spr = m.Value.Replace("<CultureName>", "").Replace("</CultureName>", "")
    14. Next
    15. matches = Regex.Matches(str_target, "<CultureName>[a-z]{2}-[A-Z]{2}</CultureName>")
    16. For Each m As Match In matches
    17. str_target_spr = m.Value.Replace("<CultureName>", "").Replace("</CultureName>", "")
    18. Next
    19. End If
    20. str_source = Regex.Replace(str_source, "</Elements><CultureName>[a-z]{2}-[A-Z]{2}</CultureName></Segment>", "")
    21. regexp = "<Tag>(.*?)</Tag>"
    22. matches = Regex.Matches(str_source, regexp)
    23. For Each m As Match In matches
    24. count += 1
    25. dic_result.Add("{t" & count & "}", m.Value)
    26. str_source = str_source.Replace(m.Value, "{t" & count & "}")
    27. str_target = str_target.Replace(m.Value, "{t" & count & "}")
    28. Next
    29. matches = Regex.Matches(str_target, regexp)
    30. For Each m As Match In matches
    31. count += 1
    32. dic_result.Add("{t" & count & "}", m.Value)
    33. str_target = str_target.Replace(m.Value, "{t" & count & "}")
    34. Next
    35. str_target = str_target.Replace("<Text><Value>", "")
    36. str_target = str_target.Replace("</Value></Text>", "")
    37. str_target = str_target.Replace("<Segment xmlns:xsi=""[url][url]http://www.w3.org/2001/XMLSchema-instance[/url[/url]]"" xmlns:xsd=""[url][url]http://www.w3.org/2001/XMLSchema[/url[/url]]""><Elements>", "")
    38. str_target = Regex.Replace(str_target, "</Elements><CultureName>[a-z]{2}-[A-Z]{2}</CultureName></Segment>", "")
    39. matches = Regex.Matches(str_target, str_regex_target)
    40. For Each m As Match In matches
    41. count_diff += 1
    42. count += 1
    43. dic_suche.Add("{s" & count & "}", m.Value)
    44. str_tag = dic_suche.Item("{s" & count & "}")
    45. str_target = str_target.Replace(m.Value, "{s" & count & "}")
    46. 'boo_tag = True
    47. Next
    48. dt.Rows.Add(str_id.ToString, str_source.ToString, str_target.ToString)
    49. DG1.ItemsSource = dt.DefaultView



    Ich glaube du findest dich noch nicht ganz zurecht mit dem Thema WPF.

    Schuldig im Sinne der Anklage. Mein größtes Problem ist, dass ich mit Theorie überhaupt nix anfangen kann - da schaltet mein Hirn immer ab ‑ und über Learning-by-doing und über Videobeispiele versuch in eine neue Materie reinzukommen. Bis jetzt hat das immer recht gut funktioniert, aber bei WPF seh ich überall nur noch Bahnhöfe, oder so ähnlich. ;)

    Über diesen Helper (hab ein grundlegendes Beispiel an meine Bedürfnisse angepasst) habe ich es vor xceed verändert (siehe unten).

    Erklärung:
    Text wird aus SQLite gelesen, bestimmte Strings werden mit {s\d+} bzw. {t\d+} ersetzt und diese Strings in den geschwungenen Klammern wurden dann beim Befüllen der RTBs auf Rot der Violett und Fett formatiert. Idealerweise würden sie nicht formatiert sondern mit einem farbigen Tag bzw. Token ersetzt, damit die Benutzer sie noch leichter erkennen können. Leider hab ich bis jetzt nichts gefunden, um das umsetzen zu können. Daher die Lösung mit den Formatierungen, die auch schon sehr hilfreich ist.
    Der Benutzer selbst kann und soll nichts formatieren, nur bestehenden Text ändern bzw. bestimmte Tags/Tokens löschen oder innerhalb derselben RTB verschieben (kopieren und einfügen) können. Und dieser fertige Text soll dann per Schaltfläche wieder von den Formatierungen befreit und die geschwungenen Klammern wieder in den Ursprungstext (in dics gespeichert) umgewandelt werden, bevor dann alles zurück in die DB gespeichert wird.

    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


    LG,
    Pascal

    *Richtige codeTags gesetzt* ~NoFear23m
    :!: 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 „Nofear23m“ ()

    Translating-IT schrieb:

    der Rest passiert "automatisch"

    Ne, tuts nicht. So wie es aussieht. Du verratest ja nicht was dt gneau ist, aber Anhand des Code vermute ich ein DataTable. Und da haben wir den Punkt.

    Hier werden alte Technologien mit neuer "vermischt" weil man meint es "geht automatisch". Das ist das Problem.
    Du wirst mit dem DataTable noch oft in verbindung mit der WPF an deine (oder die des DataTables) Grenzen kommen da es einfach nicht gut mit der WPF harmoniert.
    Aber keine Angst. Es ist nicht viel passiert. Anstatt das du ein DataTable füllst empfehle ich dir einfach Klasseninstanzen zu füllen. Das funktioniert nicht nur prima sondern du hast auch die Kontrolle.

    Aber ich sehe du liest eine XML aus, aber sehr umständlich, das geht sicher um einige besser. Aber gut, das ist wieder ein anderes Thema. Wie gesagt, wenn wir wissen was genau du machen versuchst können wir besser helfen.
    Aber zurück zum Thema.

    Mach dir eine Klasse. Ich weis nicht um was es hier geht (was in der XML drinnen steht), aber ich nehme jetzt mal das Beispiel mit Autos.
    Ein Klasse z.b. Auto. Diese Klasse hat Eigenschaften. Das sind vermutlich die Attribute aus deiner xml. Marke, Modell, Farbe usw. Das sind deine Properties.
    OK, dann erstellst du dir noch eine Klasse z.b. AutoVerwaltung. Diese representiert jetzt quasi dein Fenster im XAML.
    Diese Klasse besitzt nun ein Property: z.b. AllCars As ObservableCollection(Of Auto).
    Diese Liste befüllst du mit den "Autos" die du aus der xml ausliest. Das DataGrid bindest du dann einfach nur noch mit {Binding AllCars}, natürlich auch die Spalten dann auf die richtigen Eigenschaften und schon funzt alles.

    Klingt jetzt kompliziert, ist es aber nicht.

    Wie gesagt, in meinem Tutorial wurden diese Dinge bereits behandelt. Guck dir ein wenig davon an, wirst sicher einige lernen können (hoffe ich).
    Falls du wo "hängst" sag einfach bescheid.

    Translating-IT schrieb:

    Binding ist doch im XAML und wird soweit ich das verstanden habe, über die DG1…-Zeile

    Schon, aber das hier: DG1.ItemsSource = dt.DefaultView ist alles nur kein Binding. Wie gesagt, Tutorial! - Die WPF "tickt" anders, und je früher du Binding versthst und auch nutzt, desto mehr spaß macht die WPF.

    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. ##

    Du verratest ja nicht was dt gneau ist


    doch, hab ich. ;)
    Wirklich nur mit dieser einen Zeile über ein Datatable


    Aber ich sehe du liest eine XML aus, aber sehr umständlich, das geht sicher um einige besser.


    auch falsch. Ich habe geschrieben, dass ich eine Tabelle aus SQLite bzw. der Datenbank (DB) auslese und die Daten nachher wieder dort speichern möchte.
    im Code
    … 'auslesen aus SQLite …
    aber auch mehrfach in den Erklärungen. *kaffeereichzumaufwachen*

    Umständlich glaub ich nicht, für meinen Zweck, ist es recht gut umgesetzt, da ich einiges im String aus der DB ändern muss, weil der Benutzer das nicht sehen soll, um ja nicht in Versuchung zu kommen, es zu löschen oder ändern. Optimieren kann ich, falls möglich, später noch (2 oder 3 Dinge wiederholen sich im Code). So komm ich weniger durcheinander und kann bei Bedarf noch was ändern, falls es doch an der Stelle besser zu lösen ist, als mit demselben Code wie woanders. Erst mal soll alles funktionieren wie geplant.

    Klasseninstanzen … = kleiner Bahnhof, werd ich mir nochmal raussuchen und genauer anschauen ;)
    Hab ich schon mehrfach überflogen, aber für diese Projekt nicht geeignet. (siehe unten)

    Auto und ähnliches macht keinen Sinn für mich, da ich keine Properties habe. Ist wie gesagt keine XML und die einzige Spalte in der DB, die immer das gleiche aussagt ist die ID, die anderen sind 1 bis n Wörter lange Strings, die in 99 % der Fälle, nie gleich sind oder miteinander zu tun haben. Je Reihe sind source und target zwar zusammenhängend, aber oft nicht innerhalb der Spalte. Ich weiß, das macht für viele keinen Sinn, aber diese Tabellen sind leider so aufgebaut und eine Erklärung wäre viel zu langwierig und hätte mit dem Thema (Problem) nichts zu tun. Für die sehr eingeschränkte Benutzergruppe des Tools, ergibt das aber alles einen Sinn.

    Die Daten sind nicht immer z. B. Marke, Modell, sondern einmal evlt. Marke, Marke, in der nächsten Reihe kann aber Obst, Obst stehen, oder ganzer Satz, ganzer Satz …

    ist alles nur kein Binding

    hab schon Deine Videos überflogen und eines über Bindings gefunden, hatte nur noch einiges heute Abend zu tun und konnte es noch nicht anschauen. Wird aber in der nächsten Stunde geschehen.

    Das schriftliche Tutorial ist bei mir leider verlorene Müh … Auch wenn lesen ein wichtiger Teil meines Berufs ist (zum Glück keine Theorie, die ich verstehen muss), aber mein Hirn ist da leider etwas anders aufgebaut und bei Theorie kanllen bei mir immer die Sicherungen. -> Schädelweh und große grauschwarze Wolke. Ich muss es "sehen" und anwenden, um etwas verstehen zu können.

    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“ ()

    Die Tutorials sind sehr gut gemacht. Und alles nur überfliegen, oder nur einmal lesen bringt wirklich nicht viel. Aber zum Glück hat @Nofear23m in allen Tutorials eine kleine solution bei wo man es sich ansehen kann, oder, was ich bevorzuge, man baut es selbst nach und sieht was passiert. Na macht es auch ganz schnell klick. Nur vom reinen lesen lernt man kein programmieren. Man muss schon rumprobieren.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo @Translating-IT

    Sorry, mein Fehler. hatte ich total überlesen mit dem Dataset. Bez. der SQL Abfrage. Ja, das hattest du geschrieben und im code finde ich ein Kommentar aber ich sehe da viele Strings ala <Text><Value>, deshalb dachte ich ..... Naja, egal. Ist ja auch nicht die Fragestellung.

    Translating-IT schrieb:

    Hab ich schon mehrfach überflogen, aber für diese Projekt nicht geeignet.

    Naja, doch. Für JEDES Projekt unter WPF. Das ist essentiell. WPF funktioniert anders. Wenn du einen Getter und einen Setter haben möchtest (du also eingreifen möchtest) brauchst du ein sogenanntes ViewModel.

    Translating-IT schrieb:

    Auto und ähnliches macht keinen Sinn für mich, da ich keine Properties habe.

    Eben diese zu haben ist das Ziel !! Du hast Klassen und Eigenschaften. Auf diese wird gebunden. Fertich. Das ist WPF in der korrekten Anwendung.

    Wenn du nicht klar kommst und ein mini-Beispielprojekt benötigst sage Bescheid, da kann ich sicher was Basteln.

    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. ##

    Hi,

    Sorry für die späte Rückmeldung, aber war die letzen Wochen recht eingebunden und bin zu nix mehr gekommen.

    @Akanel
    Und alles nur überfliegen, oder nur einmal lesen bringt wirklich nicht viel.


    Überfliegen im Sinne von, schauen welche Themen es gibt, bringt schon was für den Anfang. ;) Nichtsdestotrotz bringen mir die schriftlichen Tutorials eher weniger.

    Dafür muss ich aber sagen, dass ich mir endlich mal das Video mit den Bindings fertig anschauen konnte und es ist das erste Mal, dass ich ein Tutorial sehe, wo nicht bloß deppert rumgeklickt wird à la, wenn wir hier klicken, bekommen wir das, und dann können wir hier klicken … und ich habe mir schon Tutorialvideos in vielen Sprachen angeschaut.

    Sascha macht ganze Arbeit und erklärt was passiert, wenn man wo hinklickt, und was bei den verschiedenen Optionen passiert. :thumbsup: Somit auch für Einsteiger, und jene, die gerne verstehen möchten, was da überhaupt passiert, sehr geeignet.

    Die Bindings hab ich schon öfters gelesen und "verstanden" und auch anwenden können ‑ auch wenn ich es weiter oben nicht richtig ausdrücken konnte ‑ aber meist war nur ein kleiner Überriss angegeben. Hier ist recht viel, sehr verständlich erklärt worden.

    Nur ned böse sein, wenn ich mir nicht alles anschaue und entsprechend "dumme" fragen stelle, die doch schon behandelt sein müssten. Ich lerne anders als die meisten Menschen und entsprechend schau ich mir vieles durcheinander an, und nur dann, wenn ich es gerade benötige. Geht bei mir aber auch aus Zeitgründen nicht anders.

    @Nofear23m

    Die <text><value> sind irreführend in diesem speziellen Fall. Sie folgen keinem Schema und können daher nicht als einzelne xml verarbeitet werden. In einer Zeile, können 1 bis n tags auftreten und leider sind sie je abgefragter Tabelle nicht konsistent verteilt.

    Für JEDES Projekt unter WPF.

    Ich hab es so verstanden, dass es nur Sinn macht, wenn immer das gleiche Schema vorkommt. Hier ändert es sich aber mit jeder Zeile. Daher kann ich doch nicht sagen: Auto, Farbe, Baujahr.
    Da bekomm ich dann:
    Auto = Birne, Farbe = Rot, Baujahr = vielleicht
    Auto = Fiat, Farbe = ja, Baujahr = 2x
    ...

    Oder sitz ich mal wieder voll auf der Leitung?

    Den Rest muss ich mir noch anschauen bzw. mal rumprobieren.

    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.
    Hallo Pascal

    Translating-IT schrieb:

    Sascha macht ganze Arbeit und erklärt was passiert

    Danke für die Blumen, genau das ist mein Ziel. Ich kenne auch viele Tutorials und Videos die am Ziel vorbeischießen, ich wollte es ein wenig anders machen.

    Translating-IT schrieb:

    Die <text><value> sind irreführend in diesem speziellen Fall. Sie folgen keinem Schema und können daher nicht als einzelne xml verarbeitet werden.

    Nur du kennst das genaue Schema der Daten, wir können nur von dem ausgehen was wir hier sehen. Also musst du wissen was du aus den Daten machst was du bekommst.
    Ob das jetzt Fahrzeuge sind (Auto, Schiff, Flugzeug) oder deine Daten mit verschiedenen Attributen ist im Grunde egal. Finde gemeinsamkeiten. Bei Fahrzeugen wäre es Gewicht, Geschwindigkeit usw. Aber ein Flugzeig hat wiederum eine Flughöhe, ein Schiff die Watttiefe. Lege dir eine Klasse an welche die gemeinsamkeiten Kapselt. Je nachdem welche Daten du hast (wir kennen diese nicht) musste du dann noch weitere Klassen haben welche von der Basisklasse erben um gewisse andere Eigenschaften besitzen zu können.

    Ob du nun wir im Code oben ein Dataset in einer Schleife mit Daten befüllst oder eine List(Of MyClass) ist im Grunde ja schnuppe. Wir leben in der Objektorientierten Programmierung. Wir arbeiten also mit Objekten.
    Also sehen wir zu das wie auch Objekte bekommen. Und wenn du Daten hast (egal in welcher Form) dann siehst du zu das du aus diesen Daten Objekte machst. Und mit diesen Objekten Arbeitest du weiter.
    Du kannst also deine Methode hernehmen und anstatt eines DataSets füllst du eine Auflistung von deinen Objekten (Klasseninstanzen).

    Hast du diese Bindest du die Liste von Objekten an dein DataGrid. Und schon hast du die Daten genau so vorliegen wie du sie benötigst. Und zwar aufbereitet und schön Strukturiert, mit diesen Daten kann man dann auch wunderbar weiterarbeiten.

    Translating-IT schrieb:

    Ich hab es so verstanden, dass es nur Sinn macht, wenn immer das gleiche Schema vorkommt. Hier ändert es sich aber mit jeder Zeile.

    Nicht unbedingt. Du kannst das ganze auch sehr leicht allegemein und generisch halten, je nachde, was benötigt wird. Das wissen wir nicht. Wir kennen die Daten nicht und wissen nciht was du hast und was du im endeffekt am Ende rausbekommen willst.

    Wenn du hier genauer werden würdest könnte man sehen was man machen kann, evtl. gibt es sogar ne einfachere Lösung. Beispieldaten wären hier sicher ganz gut.

    Grüße und einen schönen Tag
    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,

    Finde gemeinsamkeiten.


    Genau das ist das Problem. Es gibt keine. Es kann sein, dass es ausnahmsweise mal welche gibt, aber das ist eher Zufall. Die Einzige Gemeinsamkeit ist, dass die erste Spalte immer ID ist, die 2. immer String 1 und die 3. immer String 2.
    wir kennen diese nicht

    Ich auch nicht, nicht mal der Benutzer, so komisch das klingt. Ich weiß NIE, was da stehen wird, das ist aber für die App-Lösung "kein Problem". Sie dient nur dazu, dem Benutzer eine Möglichkeit zu geben, die Strings zu überprüfen und ggf. Wörter in den Strings zu ersetzen oder zu löschen.

    das du aus diesen Daten Objekte machst. Und mit diesen Objekten Arbeitest du weiter.

    Aber genau das hab ich doch gemacht, oder nicht? Ich habe die Daten als Tabelle definiert und gesagt WPF soll die Tabelle binden und dann noch genauer definiert, welche Spalte in XAML wo angezeigt/gebunden werden soll. Für meine Zwecke unter den gegebenen Umständen schön in einer Tabelle strukturiert. Genauer kann ich, wie gesagt, nicht definieren.

    Klar, Auto, Schiffe, Wale oder so, würde alles vereinfachen, nur die Möglichkeit haben wir hier nicht.

    Bitte nicht falsch verstehen, aber ihr müsst mal von eurer sturen, theoretischen Ansicht Abstand nehmen, dass alle Tabellen einheitliche Daten enthalten, um etwas zu kategorisieren. Das ist zwar in 99 % der Fall, aber hier geht es um eine DB aus diesem 1 %, der abweicht und das ist für diesen Usecase auch genau richtig. Hier haben wir keine Kategorien, nur "Strings".
    Die Spalten sind immer vom Typ Int, String, String, und die Überschriften lauten auch entsprechend ID, String1, String2 und außer der ID, die ich aber nicht für die Bearbeitung benötige, da sie nicht verändert wird, sondern nur um die Ansicht besser zu strukturieren, kann sich der "Typ" und Inhalt der beiden anderen Spalten extrem unterscheiden, es können sogar einfach nur Zahlen sein, oder ein Sonderzeichen.

    Beispiele:
    ID
    String1
    String2
    1
    Auto
    Auto
    2
    Schiff
    Schoner
    3
    2 cm
    2 cm
    4
    !
    .
    5
    Groß
    Riese
    6
    2,44
    2.44
    7
    Ich bin ein Satz.
    Ich bin auch ein Satz.
    8
    Auto
    Automatisch
    9
    name@domain.tld
    name@domain.tld
    10
    name@domain.tld
    name1@domain.tld2


    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:

    Die Spalten sind immer vom Typ Int, String, String, und die Überschriften lauten auch entsprechend ID, String1, String2 und außer der ID, die ich aber nicht für die Bearbeitung benötige


    Na bitte, das reicht auch schon. Wenn dies die Infos sind die gegeben sind weist du das die Properties der Klasse alle Strings sind. Ich persönlich denke nicht stur und theoretisch, glaub mir.

    Also, deine Klasse könnte (wenn es 3 Spalten gibt, bei mehr bitte anpassen) so aussehen:

    VB.NET-Quellcode

    1. Public Class MyListItem
    2. Public sub New(_id as integer, _string1 as String, _string2 as String, _string 3 as String)
    3. ID = _id : String1 = _string1 : String2 = _string2 : String3 = _string3
    4. End Sub
    5. Public Property ID As Insteger
    6. Public Property String1 as String
    7. Public Property String2 as String
    8. Public Property String3 as String
    9. End Class


    Und dann kannst du eine Liste erstellen:

    VB.NET-Quellcode

    1. Public Property MyItemsList as ObservableCollection(Of MyListItem)


    So, und statt einem Dataset befüllst du nun diese:

    VB.NET-Quellcode

    1. MyItemsList = New Observablecollection(Of MyItemsList)
    2. For each .........
    3. MyItemsList.Add(New MyItemsList(idFromDb, string1FromDb,string2FromDb,string3FromDb))
    4. Next


    Die Liste Bindest du an dein DataGrid und nun hast du volle Kontrolle und bist flexibler wie mit jedem DataTable. Das wäre zumindest mein Lösungsansatz, der ist OOP und MVVM konform. Wenn du findest das wäre stur ist das OK für mich wobei ich denke das es besser ist mit Klassen zu Arbeiten, vorallem in der WPF als mit einem DataSet, da die WPF nicht wirklich gut dafür geeignet ist (was du ja gemerkt hast).

    PS: code ist einfach aus dem Kopf geschrieben und ist somit Pseudocode.

    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,

    Das ganze in eine Observablecollection einzubinden hatte ich schon versucht. Bei meinem Ansatz habe ich die OC direkt befüllt, ohne vorher ne Liste zu erstellen und diese dann umzuwandeln (ein Schritt gespart). Hat nicht funktioniert für dieses Projekt, und das hast Du mir auch im anderen Thread bestätigt, dass das mit den RTBs nicht funktioniert:

    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.


    Deshalb habe ich die Datatable hier verwendet. Bin jetzt etwas verwirrt …

    Andererseits brauche ich hier für dieses Projekt nicht so viel Flexibilität. Ich muss nur die Daten in die RTBs bekommen, das funktioniert auch schon problemlos.
    Der nächste Schritt (die Formatierung der in die RTBs geladenen Texte) ist derzeit das Problem (siehe Fragestellung) und ich bin noch nicht dazu gekommen, mithilfe der neuen Erkenntnisse deines Videos zu versuchen etwas zu basteln und rumzutesten.
    Wenn der Benutzer fertig ist, soll er eine Schaltfläche anklicken, um die Daten zu speichern. Das funktioniert mit Deinem Vorschlag mit xceed-RTBs in meinem ersten Thread nun auch problemlos.

    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 das hast Du mir auch im anderen Thread bestätigt, dass das mit den RTBs nicht funktioniert

    Da gings aber auch um die normale RTB und nicht um die von xceed. Die RTB von XCeed hat dieses Property ja.

    Translating-IT schrieb:

    Andererseits brauche ich hier für dieses Projekt nicht so viel Flexibilität.

    Ob du es brauchst oder nicht ist erstmal egal. Die Frage lautet wie du einen Getter und einen Setter bekommst. Das ist der Titel des Threads. Und hierfür benötigt es ein Property mit Getter und Setter.
    Hast du es denn überhaupt probiert?

    Stat eines DataSets eine List(Of T) zu füllen ist ein Codeumbau von ein paar Minuten, da kann man erwarten das du es zumindest probierst. Und wenn du das hast zeige den code hier damit alle mal auf dem selben Wissensstand sind. Bis dahin bin ich hier raus. Nicht böse gemeint aber die Frage im Titel ist damit beantwortet.

    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. ##

    Sorry Sascha,

    aber manchmal hab ich das Gefühl, Du liest die Antworten nicht genau durch: ;)

    ich habe in meiner letzten Antwort geschrieben, dass ich:

    - schon mit OCs in dem Projekt gearbeitet habe, es nur verworfen habe wegen Deiner Antwort. Dass ich sogar direkt ein OC erstellt habe und nicht über die list of gegangen bin

    wenn es mit xceed funktioniert, dann brauch ich nur die paar Zeilen für die OC wieder auskommentieren.

    - es seit ich den Thread eröffnet habe, nicht mehr weiter probiert habe, da noch keine Zeit gehabt. Davor hatte ich es schon etwas versucht, aber war eher etwas verloren. Get und Set hatte ich schon erstellt, aber bin nicht weiter gekommen.

    Das steht aber noch auf der Liste, sobald ich wieder etwas Zeit freischaufeln kann, da ich beim Videoschauen ein paar Ideen bekommen habe. Ob sie denn funktionieren, weiß ich noch nicht.

    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.
    Doch, doch. Ich lese die Antworten. Aber du vieleicht nicht.

    Es geht NICHT aleine um die Observablecollection. Ob du die ObservableCollection direkt instanziierst und befüllst oder ob die Ihr eine List(Of T) übergibst macht keinen Unterschied für das aktuelle "problem".
    Es geht um die eigendliche Klasse also um T. die habe ich bei dir noch nicht gesehen und du hast auch nicht geschrieben das du es so wie ich es gepostet habe (mit den vielen Codepassagen) prorbiert hast.

    Wir können hier nur zig Beiträge schreiben, ich habe kein Problem damit. Du wirst nur nicht wirklich weiterkommen. Es kommt mir vor als wolltest du gar nicht in die richtige Richtung gelenkt werden.
    Ich arbeite seit über 10 Jahren mit der WPF und kenne die Problematik das man plötzlich "ansteht" wenn man gewisse Dinge versucht so zu machen wie man es von winForms gewöhnt ist. Aber wenn du dich nicht in die richtige Richtung lenken lässt versuchs gerne mal anders und Berichte dan bitte wie du es schlussendlich geschafft hast. Würde mich intreressieren.

    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,

    Ich bin sehr wohl gewillt zu lernen und vor allem es selbst zu versuchen. Ich will sicher keine direkt vordefinierten Lösungen. In richtige Richtungen lenken ok, nur hier war einiges voll verpeilt, da es mit der Fragestellung nichts zu tun hat.

    Ich muss jetzt nur mal etwas Zeit freischaufeln, um wieder zu programmieren und dann nochmal Dein Video über Bindings anschauen, da sich mir hier einige Ideen ergeben habe, mit denen ich evtl. vorankomme. Ob ich es schaffe, ist eine andere Frage. Entsprechend werde ich dann meinen Ansatz hier posten und "zerfleddern" ;) lassen.

    Offen ist noch die Frage aus Post Nr. 5, ob ich davon etwas verwenden kann oder besser von vorne beginne.


    Ob du die ObservableCollection direkt instanziierst und befüllst oder ob die Ihr eine List(Of T) übergibst macht keinen Unterschied für das aktuelle "problem".


    das ist mir schon klar, habe ich ja auch selber geschrieben, als ich darauf hingewiesen habe:
    Andererseits brauche ich hier für dieses Projekt nicht so viel Flexibilität. Ich muss nur die Daten in die RTBs bekommen, das funktioniert auch schon problemlos.
    Der nächste Schritt (die Formatierung der in die RTBs geladenen Texte) ist derzeit das Problem (siehe Fragestellung) und ich bin noch nicht dazu gekommen, mithilfe der neuen Erkenntnisse deines Videos zu versuchen etwas zu basteln und rumzutesten.



    wie man es von winForms gewöhnt ist.


    Ich habe noch nie mit winforms gearbeitet und kenne dessen Funktionsweise nicht. Ich habe direkt mit WPF begonnen.


    Lies Dir den Rest bitte mal durch und mach Dir bitte selbst ein Bild davon, was ich damit meine, wenn ich sage, die Posts werden nicht richtig durchgelesen: (ist wirklich nicht böse gemeint)


    Der Verdacht mit den Antworten nicht durchlesen kommt daher, dass Du erst auf die OC zu sprechen kamst, als ich nochmals darauf hingewiesen habe, dass in der DB nur ID und Strings sind. Das hatte ich zuvor auch schon im Post Nr. 9 ausgesagt:

    Ist wie gesagt keine XML und die einzige Spalte in der DB, die immer das gleiche aussagt ist die ID, die anderen sind 1 bis n Wörter lange Strings, die in 99 % der Fälle, nie gleich sind oder miteinander zu tun haben.


    Davon mal abgesehen, dass dieser Teil mit der eigentlichen Frage dieses Threads nichts zu tun hat, sondern eher kosmetisch und evtl. für spätere Optimierung zum Tragen kommt. Der Teil des Get und Set ist gänzlich untergegangen. Nichtsdestotrotz wurde ständig auf eine Kategorisierung hingewiesen.

    In Post Nr. 6 fragst Du
    Du schreibst du willst an dem Text was verändern. In wie fern verändern. Text ansich oder die Textfarbe oder was?


    Das hatte ich in Post Nr. 3 schon beantwortet:
    Das war an sich kein Problem, da ich eh nur beim Befüllen ein paar Strings umformatieren musste.

    Ich wollte nun versuchen, die Logik für die Formatierung bestimmter Strings ({s\d+} bzw. {t\d+}) in die xceed RTBs einzubinden.



    LG,
    Pascal

    Edits: kleinere Umformatierungen, da ich keine Vorschaufunktion beim Antworten finde.
    :!: 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“ ()