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

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

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

    Neu

    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

    Neu

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

    Neu

    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

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

    Neu

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

    Neu

    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

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

    Neu

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

    Neu

    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

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

    Neu

    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.

    Neu

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