Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态更改文本块中的多行文本_C#_Wpf_Binding_Textblock_Twitch - Fatal编程技术网

C# 动态更改文本块中的多行文本

C# 动态更改文本块中的多行文本,c#,wpf,binding,textblock,twitch,C#,Wpf,Binding,Textblock,Twitch,大家好,我正在尝试将twitch聊天推到TextBlock中,只使用mvvm和TextBlock就可以了,但现在我想实际给用户名上色,但不确定如何创建多行,因为我现在使用的方式只是替换了以前的消息,所以我需要帮助才能前进。谢谢\ Xaml: 因此,问题是我希望它是多行的,而不是每次收到消息时都替换运行。我认为您采用了错误的方法。您必须将聊天视为一组消息。您希望在收到每条消息时单独显示它们。这要求使用列表框,其中每个项目代表一条单独的消息: ChatMessage.cs class ChatMes

大家好,我正在尝试将twitch聊天推到TextBlock中,只使用mvvm和TextBlock就可以了,但现在我想实际给用户名上色,但不确定如何创建多行,因为我现在使用的方式只是替换了以前的消息,所以我需要帮助才能前进。谢谢\

Xaml:


因此,问题是我希望它是多行的,而不是每次收到消息时都替换运行。

我认为您采用了错误的方法。您必须将聊天视为一组消息。您希望在收到每条消息时单独显示它们。这要求使用
列表框
,其中每个项目代表一条单独的消息:

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));
  }
}
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));
  }
}
ViewModel.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));
  }
}
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));
  }
}
类视图模型:INotifyPropertyChanged
{
公共ObservableCollection消息{get;set;}
私有无效客户端\u OnMessageReceived(对象发送方,onMessageReceiveArgs e)
{
var chatMessage=新chatMessage
{ 
用户名=$“{e.ChatMessage.DisplayName}:”,
Message=e.ChatMessage.Message
UsernameColor=e.ChatMessage.ColorHex
}
this.Messages.Add(chatMessage);
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
this.PropertyChanged?.Invoke(this,newpropertychangedeventargs(propertyName));
}
}
main window.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>


@是否要为每条邮件创建一个新的
?@dbvega否我只想要一个文本块,问题是您需要将其设置为多行?要解决多行问题,请将其更改为
然后
然后
仅使用一个
文本块的原因是什么?这听起来更像是一个物品控件的用例。你是完全正确的好先生,我从错误的角度看它,谢谢你!我想我已经没有练习了。我很高兴我能帮上忙。您可以轻松设置ListBoxItem的样式以删除列表外观。可以将ListBoxItem.IshittesVisible设置为false以禁用选择和高亮显示。我认为在列表框而不是项目上禁用命中测试应该足够了。