using DevExpress.Utils; using DevExpress.XtraEditors; using Ips.Library.Basic; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Ips.Library.DxpLib { public partial class LogCtrl : XtraUserControl { public LogCtrl() { InitializeComponent(); InitCtrl(); IpsLogger.Logged += (self, e) => { switch (e.LogType) { case LogType.Info: Serilog.Log.Information(e.Content); break; case LogType.Warn: Serilog.Log.Warning(e.Exception, e.Content); break; case LogType.Error: Serilog.Log.Error(e.Exception, e.Content); break; } if (e.WriteToUI) { if (e.Exception != null && !string.IsNullOrWhiteSpace(e.Exception.Message) && e.Content != e.Exception.Message) e.Content = $"{e.Content},{e.Exception.Message}"; this.AddLog(e.LogType, e.Content); } }; this.Dock = DockStyle.Fill; } public bool AutoMoveToLastLine { get; set; } = true; public LogType MinLevel { get; set; } = LogType.Info; SvgImageCollection _logTypeImgList; BindingList LogList = new BindingList(); public void AddInfo(string msg) { AddLog(LogType.Info, msg); } public void AddWarn(string msg) { AddLog(LogType.Warn, msg); } public void AddError(string msg) { AddLog(LogType.Error, msg); } public void AddLog(LogType logType, string logContent) { if (logType < MinLevel) return; try { this.Invoke(() => { LogList.Add(new LogInfo() { LogType = logType, LogTime = DateTime.Now, LogContent = logContent }); while (LogList.Count > 2000) { LogList.RemoveAt(0); } if (AutoMoveToLastLine) gvLog.MoveLastVisible(); }); } catch (InvalidOperationException) { //屏蔽UI退出释放的异常 } } private void InitCtrl() { repLogTypeImgCbx.Items.AddEnum(); for (int i = 0; i < repLogTypeImgCbx.Items.Count; i++) repLogTypeImgCbx.Items[i].ImageIndex = i; _logTypeImgList = new SvgImageCollection(this.components); ((System.ComponentModel.ISupportInitialize)(_logTypeImgList)).BeginInit(); //_logTypeImgList.Add("next", "image://svgimages/arrows/next.svg"); _logTypeImgList.Add("about", "image://svgimages/outlook inspired/about.svg"); _logTypeImgList.Add("warning", "image://svgimages/status/warning.svg"); _logTypeImgList.Add("highimportance", "image://svgimages/outlook inspired/highimportance.svg"); ((System.ComponentModel.ISupportInitialize)(_logTypeImgList)).EndInit(); repLogTypeImgCbx.SmallImages = _logTypeImgList; } private void LogCtrl_Load(object sender, EventArgs e) { grdLog.DataSource = LogList; } private void IpsLoggerLogged(object sender, IpsLogEventArg e) { AddLog(e.LogType, e.Content); } private void btnClearLog_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { LogList.Clear(); } private void btnCopyRow_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { gvLog.CopyToClipboard(); } private void btnCopyRowCell_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { } private void btnAutoMoveToLast_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { AutoMoveToLastLine = btnAutoMoveToLast.Checked; } private void gvLog_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e) { btnCopyRow.Enabled = gvLog.FocusedRowObject != null; logMenu.ShowPopup(Cursor.Position); } } public class LogInfo { public LogType LogType { get; set; } public DateTime LogTime { get; set; } public string LogContent { get; set; } } }