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