Многострочный текст в динамически измененном TextBlock - PullRequest
0 голосов
/ 13 июля 2020

Привет, поэтому я пытаюсь превратить sh чат twitch в TextBlock, и он отлично работал, просто используя mvvm с текстовым блоком, но теперь я хочу фактически раскрасить имя пользователя и не уверен, как сделать это многострочным, потому что способ Теперь он у меня есть, он просто заменяет предыдущее сообщение, поэтому мне понадобится помощь, чтобы двигаться дальше. спасибо! \

Xaml:

<TextBlock Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" Background="Gainsboro" FontSize="14" Text="" Margin="5,5,5,5">
            <Run Text="{Binding Username, Mode=OneWay}" Foreground="{Binding UsernameColor, Mode=OneWay}" />
            <Run Text="{Binding Message, Mode=OneWay}" />
</TextBlock>

Событие:

private void Client_OnMessageReceived(object sender, OnMessageReceivedArgs e)
        {
            Username = $"{e.ChatMessage.DisplayName}:";
            Message = e.ChatMessage.Message;
            UsernameColor = e.ChatMessage.ColorHex;
        }

, поэтому проблема в том, что я хочу, чтобы он был многострочным, а не заменял Runs каждый раз, когда приходит сообщение через

1 Ответ

1 голос
/ 13 июля 2020

Я думаю, вы ошибаетесь. Вы должны рассматривать чат как набор сообщений. Вы хотите отображать каждое сообщение по отдельности по мере их поступления. Это требует использования ListBox, где каждый элемент представляет отдельное сообщение:

ChatMessage.cs

class ChatMessage : INotifyPropertyChanged
{
  private string username;
  public string Username
  {
    get => this.username;
    set
    {
      this.username = value;
      OnPropertyChanged();
    }
  }

  private string message;
  public string Message
  {
    get => this.message;
    set
    {
      this.message = value;
      OnPropertyChanged();
    }
  }

  private string colorValue;
  public string ColorValue
  {
    get => this.colorValue;
    set
    {
      this.colorValue = value;
      OnPropertyChanged();
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }
}

ViewModel.cs

class ViewModel : INotifyPropertyChanged
{
  public ObservableCollection<ChatMessage> Messages { get; set; }

  private void Client_OnMessageReceived(object sender, OnMessageReceivedArgs e)
  {
    var chatMessage = new ChatMessage
    { 
      Username = $"{e.ChatMessage.DisplayName}:",
      Message = e.ChatMessage.Message
      UsernameColor = e.ChatMessage.ColorHex
    }
    this.Messages.Add(chatMessage);
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }
}

MainWindow.xaml

<Window>
  <Window.DataContext>
    <ViewModel />
  <Window.DataContext>

  <ListBox ItemsSource="{Binding Messages}"
           IsHitTestVisible="False">
    <ListBox.ItemTemplate>
      <DataTemplate DataType="{x:Type ChatMessage}">
        <StackPanel Orientation="Horizonatal">
          <TextBlock Text="{Binding Username}" 
                     Foreground="{Binding ColorValue}" />
          <TextBlock Text="{Binding Message}" />
        </StackPanel>
      </DataTemplate >
    </ListBox.ItemTemplate>
  </ListBox ItemsSource="{Binding Messages}">
</Window>
...