LogInfo.xaml.cs 3.28 KB
using HHECS.Infrastructure.Enums;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace HHECS.WinCommon.Controls
{
    /// <summary>
    /// LogInfo.xaml 的交互逻辑
    /// </summary>
    public partial class LogInfo : UserControl
    {
        public ObservableCollection<LogCon> LogCons
        {
            get { return (ObservableCollection<LogCon>)GetValue(LogConsProperty); }
            set { SetValue(LogConsProperty, value); }
        }

        // Using a DependencyProperty as the backing store for LogCons.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty LogConsProperty =
            DependencyProperty.Register("LogCons", typeof(ObservableCollection<LogCon>), typeof(LogInfo), new PropertyMetadata(new ObservableCollection<LogCon>()));


        TimeSpan interval = new TimeSpan(0, 0, 5);
        public static readonly object LockObject = new object();

        public LogInfo()
        {
            InitializeComponent();
            Binding binding = new Binding("LogCons") { Source = this };
            list_Log.SetBinding(ListBox.ItemsSourceProperty, binding);
        }

        /// <summary>
        /// 添加日志
        /// </summary>
        /// <param name="log"></param>
        /// <param name="level">1显示绿色,2显示红色,3黄色</param>
        public void AddLogs(string log, Level level)
        {
            lock (LockObject)
            {
                //List<LogCon> list = LogCons.ToList();
                if (LogCons.Any(t => t.Content == log))
                {
                    LogCons.FirstOrDefault(t => t.Content == log).Dt = DateTime.Now;
                }
                else
                {
                    LogCons.Add(new LogCon()
                    {
                        Dt = DateTime.Now,
                        Content = log,
                        Level = level switch
                        {
                            Level.Info => new SolidColorBrush(Colors.Transparent),
                            Level.Exception or Level.Error or Level.Failure => new SolidColorBrush(Colors.Red),
                            Level.Success => new SolidColorBrush(Colors.Green),
                            Level.Warning => new SolidColorBrush(Colors.Yellow),
                            _ => new SolidColorBrush(Colors.Transparent),
                        }
                    });
                }
                //按5一组秒内排序
                LogCons = new ObservableCollection<LogCon>(LogCons.OrderByDescending(t => t.Dt.Ticks / interval.Ticks).ThenByDescending(t => t.Content));
                if (LogCons.Count > 100)
                {
                    LogCons.Remove(LogCons.Last());
                }
            }
        }
    }

    public class LogCon : ViewBase
    {
        public DateTime Dt { get; set; }

        public string Content { get; set; }

        public SolidColorBrush Level { get; set; }
    }
}