Inhalt einer RichTextBox in eine ListView einfügen

  • WPF

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Julius.

    Inhalt einer RichTextBox in eine ListView einfügen

    Huhu,

    ich tue mich gerade bischen schwer, den Inhalt einer RichTextBox in eine ListView einzufügen.
    Mit dem momentanen Code kann ich zwar den Text kopieren, aber leider nicht das Rectangle =/

    XML-Quellcode

    1. <ListView x:Name="ListView1" HorizontalAlignment="Left" Height="283" Margin="123,10,0,0" VerticalAlignment="Top" Width="459">
    2. <ListView.View>
    3. <GridView>
    4. <GridViewColumn Header="Chat" Width="400" DisplayMemberBinding="{Binding HeaderChat}"/>
    5. <GridViewColumn Header="Uhrzeit" DisplayMemberBinding="{Binding HeaderTime}" />
    6. </GridView>
    7. </ListView.View>
    8. </ListView>
    9. <RichTextBox x:Name="RichTextBox1" HorizontalAlignment="Left" Height="131" Margin="137,320,0,0" VerticalAlignment="Top" Width="341">
    10. <FlowDocument>
    11. <Paragraph>
    12. <Run Text="Test"/>
    13. <Rectangle Width="20" Height="20" Fill="Black"/>
    14. </Paragraph>
    15. </FlowDocument>
    16. </RichTextBox>


    VB.NET-Quellcode

    1. ListView1.Items.Add(New With {.HeaderChat = New TextRange(RichTextBox1.Document.ContentStart, RichTextBox1.Document.ContentEnd).Text, .HeaderTime = Date.Now.Hour & ":" & Date.Now.Minute})
    So hab mich mal versucht, mich an diesem Tutorial zu orientieren Link
    Hier mein Code:

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:local="clr-namespace:WpfApplication2"
    5. Title="MainWindow" Height="435" Width="600">
    6. <Grid>
    7. <DockPanel>
    8. <DockPanel DockPanel.Dock="Bottom">
    9. <Button Content="Send" Height="50" Width="60" DockPanel.Dock="Right" Click="Button_Click_1"/>
    10. <RichTextBox x:Name="HierWirdReinGeschrieben"/>
    11. </DockPanel>
    12. <ListView x:Name="ListView1">
    13. <ListView.View>
    14. <GridView>
    15. <GridViewColumn Header="ChatVerlauf" Width="380">
    16. <GridViewColumn.CellTemplate>
    17. <DataTemplate>
    18. <RichTextBox>
    19. </RichTextBox>
    20. </DataTemplate>
    21. </GridViewColumn.CellTemplate>
    22. </GridViewColumn>
    23. <GridViewColumn Header="Sendestatus" Width="100">
    24. <GridViewColumn.CellTemplate>
    25. <DataTemplate>
    26. <CheckBox Checked="{Binding ColumnBroadcastStatus}"/>
    27. </DataTemplate>
    28. </GridViewColumn.CellTemplate>
    29. </GridViewColumn>
    30. <GridViewColumn Header="Uhrzeit" Width="100">
    31. <GridViewColumn.CellTemplate>
    32. <DataTemplate>
    33. <TextBlock Text="{Binding ColumnDate}"/>
    34. </DataTemplate>
    35. </GridViewColumn.CellTemplate>
    36. </GridViewColumn>
    37. </GridView>
    38. </ListView.View>
    39. </ListView>
    40. </DockPanel>
    41. </Grid>
    42. </Window>


    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.ComponentModel
    3. Public Class Chat
    4. Implements INotifyPropertyChanged
    5. Public Sub New(ByVal _ColumnChat As String, ByVal _ColumnDate As Date, ByVal _ColumnBroadcastStatus As Boolean)
    6. ColumnChat = _ColumnChat
    7. ColumnDate = _ColumnDate
    8. ColumnBroadcastStatus = _ColumnBroadcastStatus
    9. End Sub
    10. Private _Chat As String
    11. Public Property ColumnChat As String
    12. Get
    13. Return _Chat
    14. End Get
    15. Set(ByVal value As String)
    16. _Chat = value
    17. _PropertyChangedEvent(ColumnChat)
    18. End Set
    19. End Property
    20. Private _Date As Date
    21. Public Property ColumnDate As Date
    22. Get
    23. Return _Date
    24. End Get
    25. Set(ByVal value As Date)
    26. _Date = value
    27. _PropertyChangedEvent(ColumnDate)
    28. End Set
    29. End Property
    30. Private _BroadcastStatus As Boolean
    31. Public Property ColumnBroadcastStatus As Boolean
    32. Get
    33. Return _BroadcastStatus
    34. End Get
    35. Set(ByVal value As Boolean)
    36. _BroadcastStatus = value
    37. _PropertyChangedEvent(ColumnBroadcastStatus)
    38. End Set
    39. End Property
    40. Public Sub _PropertyChangedEvent(ByVal _Property As Object)
    41. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(_Property.ToString))
    42. End Sub
    43. Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    44. End Class


    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Collections.ObjectModel
    3. Public Class ChatVerlauf
    4. Private _Chat As New ObservableCollection(Of Chat)
    5. Public Property ChatProcess() As ObservableCollection(Of Chat)
    6. Get
    7. Return _Chat
    8. End Get
    9. Set(value As ObservableCollection(Of Chat))
    10. _Chat = value
    11. End Set
    12. End Property
    13. End Class


    VB.NET-Quellcode

    1. Module ChatContainer
    2. Public WholeChat As ChatVerlauf
    3. End Module


    Und als Test:

    VB.NET-Quellcode

    1. Option Strict On
    2. Class MainWindow
    3. Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
    4. Dim item1 As New Chat("hallo", "s", True)
    5. Dim s As New ChatVerlauf()
    6. s.ChatProcess.Add(item1)
    7. ChatContainer.WholeChat = s
    8. ListView1.ItemsSource = ChatContainer.WholeChat.ChatProcess
    9. End Sub
    10. End Class


    Bevor Kritik geübt werden darf, noch eben 2 Sachen.
    1) Ist das Binding im Xaml-Code (im DataTemplate) richtig ?
    2) Muss ich ja den Text aus meiner RichTextBox(HierWirdReinGeschrieben) richtig binden, wobei ich mich bissl schwer tu.

    VB.NET-Quellcode

    1. Private _Chat As String
    2. Public Property ColumnChat As String
    3. Get
    4. Return _Chat
    5. End Get
    6. Set(ByVal value As String)
    7. _Chat = value
    8. _PropertyChangedEvent(ColumnChat)
    9. End Set
    10. End Property

    Muss ich das jetzt als UiElementCollection übergeben oder was, damit Images auch richtig dargestellt werden (String war erstmal nur prophylaktisch)>.<

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Julius“ ()

    Leider werden die Items noch immer nicht richtig in die ListViewColumns eingetragen, weiß jemand eventuell, woran das liegt ? Zudem habe ich noch ein Problem mit dem Binding an die Richtextbox.
    Hier mal die Bindings:

    XML-Quellcode

    1. <ListView x:Name="ListView1">
    2. <ListView.View>
    3. <GridView x:Name="GridView1">
    4. <GridViewColumn Header="ChatVerlauf" Width="380">
    5. <GridViewColumn.CellTemplate>
    6. <DataTemplate>
    7. <RichTextBox>
    8. </RichTextBox>
    9. </DataTemplate>
    10. </GridViewColumn.CellTemplate>
    11. </GridViewColumn>
    12. <GridViewColumn Header="Sendestatus" Width="100">
    13. <GridViewColumn.CellTemplate>
    14. <DataTemplate>
    15. <CheckBox Checked="{Binding ColumnBroadcastStatus}" />
    16. </DataTemplate>
    17. </GridViewColumn.CellTemplate>
    18. </GridViewColumn>
    19. <GridViewColumn Header="Uhrzeit" Width="100">
    20. <GridViewColumn.CellTemplate>
    21. <DataTemplate>
    22. <TextBlock Text="{Binding ColumnDate}"/>
    23. </DataTemplate>
    24. </GridViewColumn.CellTemplate>
    25. </GridViewColumn>
    26. </GridView>
    27. </ListView.View>
    28. </ListView>

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

    Okey hab es endlich geschafft, jedoch haut er mir nur ein Fehler hier raus.

    XML-Quellcode

    1. <GridViewColumn Header="Sendestatus" Width="100">
    2. <GridViewColumn.CellTemplate>
    3. <DataTemplate>
    4. <CheckBox Checked="{Binding ColumnBroadcastStatus}"/>
    5. </DataTemplate>
    6. </GridViewColumn.CellTemplate>
    7. </GridViewColumn>

    Eigentlich übergebe ich doch den Wert als Boolean, wieso meckert er dann ?
    Was ist der Fehler? Außerdem ist es ein Irrtum zu glauben, dass Checked vom Typ Boolean ist. Checked ist ein nullable Boolean(kurz auch "bool?"). Da fällt mir gerade auch auf, dass es die Checked Eigenschaft nicht gibt. Diese heißt IsChecked: msdn.microsoft.com/en-us/libra…gglebutton.ischecked.aspx


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    So noch 2 Fragen ^^


    VB.NET-Quellcode

    1. Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
    2. Dim item1 As New Chat(TextBox1.Text, Format(Date.Now, "HH:mm"), True)
    3. Dim s As New ChatVerlauf()
    4. s.ChatProcess.Add(item1)
    5. ChatContainer.WholeChat = s
    6. ListView1.ItemsSource = ChatContainer.WholeChat.ChatProcess

    1) Die ObservableCollection unterstützt gar kein "AddRange" und mit "insert" haut er mir nur den Fehler raus, dass ich mich außerhalb der Listenbegrenzung befinde.
    2) Und zwar ist die TextBox1 oben noch prophylaktisch drinne. Wenn ich jedoch jetzt den Inhalt einer RichTextBox in die Listview einfügen möchte, muss ich dann an das FlowDocument, oder nur den Paragraph (von der RichtextBox) an die RichTextbox im Datatemplate des GridViewColumns binden ?

    Edit: dachte, dass es bei 2) etwa so ginge:

    XML-Quellcode

    1. <ListView x:Name="ListView1">
    2. <ListView.View>
    3. <GridView>
    4. <GridViewColumn Header="ChatVerlauf" Width="380">
    5. <GridViewColumn.CellTemplate>
    6. <DataTemplate>
    7. <RichTextBox Document="{Binding ColumnChat}"/>
    8. </DataTemplate>
    9. </GridViewColumn.CellTemplate>
    10. </GridViewColumn>
    11. <GridViewColumn Header="Sendestatus" Width="100">
    12. <GridViewColumn.CellTemplate>
    13. <DataTemplate>
    14. <CheckBox IsChecked="{Binding ColumnBroadcastStatus}"/>
    15. </DataTemplate>
    16. </GridViewColumn.CellTemplate>
    17. </GridViewColumn>
    18. <GridViewColumn Header="Uhrzeit" Width="100">
    19. <GridViewColumn.CellTemplate>
    20. <DataTemplate>
    21. <TextBlock Text="{Binding ColumnDate}"/>
    22. </DataTemplate>
    23. </GridViewColumn.CellTemplate>
    24. </GridViewColumn>
    25. </GridView>
    26. </ListView.View>
    27. </ListView>

    VB.NET-Quellcode

    1. Public Property ColumnChat As FlowDocument
    2. Get
    3. Return _Chat
    4. End Get
    5. Set(ByVal value As FlowDocument)
    6. _Chat = value
    7. _PropertyChangedEvent(ColumnChat)
    8. End Set
    9. End Property

    und der Aufruf mit:

    VB.NET-Quellcode

    1. Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
    2. Dim item1 As New Chat(RichTextBox1.Document, Format(Date.Now, "HH:mm"), True)
    3. Dim s As New ChatVerlauf()
    4. s.ChatProcess.Add(item1)
    5. ChatContainer.WholeChat = s
    6. ListView1.ItemsSource = ChatContainer.WholeChat.ChatProcess
    7. End Sub

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

    Hmm mir wird der Fehler ""Binding" kann nicht für die Eigenschaft "Document" vom Typ "RichTextBox" festgelegt werden. "Binding" kann nur für eine "DependencyProperty" eines "DependencyObject" festgelegt werden." an Kopf geschmissen wird. Liegt das jetzt an der Property, oder am Binding ?
    Muss die Property jetzt so aussehen ?(

    VB.NET-Quellcode

    1. Public CurrentReadingProperty As DependencyProperty = DependencyProperty.Register("ColumnChat", GetType(FlowDocument), GetType(Chat))
    2. Private _Chat As FlowDocument
    3. Public Property ColumnChat As FlowDocument
    4. Get
    5. Return _Chat
    6. End Get
    7. Set(ByVal value As FlowDocument)
    8. _Chat.SetValue(CurrentReadingProperty, value)
    9. _PropertyChangedEvent(ColumnChat)
    10. End Set
    11. End Property

    Langsam verzweifel ich
    langsam kotzt mich das mit der RichTextBox an. Keine Ahnung, wie ich das anstellen soll, haste irgend ein Beispiel, wie ich den Inhalt der RichTextbox1 mit in die Column einfüge, ohne gleich wieder an die Decke zu gehen, da du die Lösung weißt?
    ich weiß die Lösung nicht.
    ich weiß nichtmal, was du vorhast - normalerweise würd niemand den Inhalt einer RTB einem ListView zufügen.
    Soll das iwie was mit einem Chat zu tun haben, wo man unten was reinschreibt, und dann auf Senden klickst?

    Dazu wäre halt ein geeignetes Viewmodel zu proggen, aber das schrieb ich bereits in post#2
    Nach nen bissl rumexperimentieren hab ich zumindestens schon einmal herausgefunden, wie man den Content einer RTB in eine andere kopiert:

    VB.NET-Quellcode

    1. RichTextBox2.Document.Blocks.Add(RichTextBox1.Document.Blocks.LastBlock)
    So habe es herausgefunden. Und zwar gibt es mehrere Arten, wie man das FlowDocument anzeigen lassen kann:
    Etweder mit einem FlowDocumentScrollViewer, FlowDocumentPageViewer, oder einem FlowDocumentReader. Dann kann man ganz einfach an das Document binden.