You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF C#开发中日志文本按类型分色显示问题求助

解决方案

你当前的问题核心是EventLogList仅存储了字符串类型的日志内容,没有携带日志级别对应的样式信息,两种实现方案如下:


方案1:新增日志实体类绑定(更易维护,推荐)

  1. 新建日志项实体类
// 如果你使用了CommunityToolkit.Mvvm,直接继承ObservableObject即可,没有的话自己实现INotifyPropertyChanged
public class LogEntry : ObservableObject
{
    private string _content;
    public string Content
    {
        get => _content;
        set => Set(ref _content, value);
    }

    private Brush _foregroundColor;
    public Brush ForegroundColor
    {
        get => _foregroundColor;
        set => Set(ref _foregroundColor, value);
    }
}
  1. 修改ViewModel中的集合定义
// 把原有的string类型集合替换为LogEntry类型
public ObservableCollection<LogEntry> EventLogList
{
    get => _eventLogList;
    set => Set(ref _eventLogList, value);
}
  1. 修改日志写入逻辑
protected sealed override void LogInfoEvent(string msg)
{ 
    EventLogList.Insert(0, new LogEntry
    {
        Content = $"{_logDate} [Info]: {msg}",
        ForegroundColor = Brushes.DarkGray
    });
    base.LogInfoEvent(msg);
}

protected sealed override void LogErrorEvent(string msg, Exception exception = null)
{
    if (IsScanningMode)
        StopScanningExecuteAsync();

    EventLogList.Insert(0, new LogEntry
    {
        Content = $"{_logDate} [Error]: {msg}",
        ForegroundColor = Brushes.Red
    });
    base.LogErrorEvent(msg, exception);
}

// 新增的成功日志写入逻辑参考
private void LogSuccessEvent(string msg)
{
    EventLogList.Insert(0, new LogEntry
    {
        Content = $"{_logDate} [Success]: {msg}",
        ForegroundColor = Brushes.Green
    });
}
  1. 修改XAML绑定规则
<ListView Height="230" ItemsSource="{Binding EventLogList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <WrapPanel Width="560">
                <TextBlock 
                    Foreground="{Binding ForegroundColor}"
                    Text="{Binding Content}"
                    TextWrapping="Wrap"/>
            </WrapPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

方案2:使用值转换器(无需修改现有集合结构)

如果你不想改动现有集合的string类型,可以通过值转换器解析日志前缀匹配颜色:

  1. 新建转换器类
public class LogLevelToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is not string logStr) return Brushes.DarkGray;
        if (logStr.Contains("[Error]")) return Brushes.Red;
        if (logStr.Contains("[Success]")) return Brushes.Green;
        return Brushes.DarkGray;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  1. 在XAML中引入转换器资源
<!-- 窗口资源或者应用资源中添加 -->
<Window.Resources>
    <local:LogLevelToBrushConverter x:Key="LogLevelToBrushConverter"/>
</Window.Resources>
  1. 修改TextBlock的Foreground绑定
<TextBlock 
    Foreground="{Binding Converter={StaticResource LogLevelToBrushConverter}}"
    Text="{Binding}"
    TextWrapping="Wrap"/>

注意此方案要求日志的级别标记[Info]/[Error]/[Success]固定,修改前缀会导致转换失效。

内容的提问来源于stack exchange,提问作者user8549547

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:06:04