WPF 自定义彩色控制台功能

小明 2025-05-01 20:54:35 4

文章目录

  • 前言
  • 环境
  • 流内容
    • 一个简单的控制台
    • 自动添加数据
      • 无法添加数据模板
      • 代码添加参数
        • 简单的案例
        • 添加和清空功能
        • 完善代码
        • 额外功能添加
          • 移动到底部
          • 添加样式
          • ���结

            前言

            在WPF中添加模拟控制台,可以试试的看到最新的日志信息。但是普通的TextBlock只是纯粹的黑色,这次试试模拟彩色的控制台界面

            环境

            • .net core 8.0
            • win10
            • visual studio 2022
            • Nuget
              • CommunityToolkit.Mvvm
              • HandyControl
              • Microsoft.Extensions.DependencyInjectio

                流内容

                流内容 官方文档

                什么是流内容?简单来说就是好看的报纸。我们这里以HandyControl的实例为例

                一个简单的控制台

                    
                        
                            
                        
                        
                            
                        
                        
                            
                        
                        
                            
                        
                    
                
                

                自动添加数据

                无法添加数据模板

                【流内容】这个是一个特殊的集合,是无法添加控件模板的

                代码添加参数

                在微软的官网文档中,有相对应的文档

                如何:通过 Blocks 属性操作流内容元素

                简单的案例

                我们先搭建一个简单的案例

                    
                        
                    
                    
                        
                            
                            
                            
                            
                            
                        
                        
                            
                                
                                    
                                
                                
                                    
                                
                                
                                    
                                
                                
                                    
                                
                            
                        
                    
                
                
                namespace WpfApp.Views
                {
                    /// 
                    /// ConsoleView.xaml 的交互逻辑
                    /// 
                    public partial class ConsoleView : UserControl
                    {
                        public ConsoleView()
                        {
                            InitializeComponent();
                            ViewModel.ConsoleView = this;
                        }
                    }
                }
                
                namespace WpfApp.ViewModels
                {
                    public partial class ConsoleViewModel : ObservableObject
                    {
                        public enum TextType { debug, info, warning, error }
                        public ConsoleView ConsoleView { get; set; }
                        public ConsoleViewModel()
                        {
                        }
                        [RelayCommand]
                        public void Clean()
                        {
                        }
                        [RelayCommand]
                        public void Debug()
                        {
                        }
                        [RelayCommand]
                        public void Info()
                        {
                        }
                        [RelayCommand]
                        public void Warning()
                        {
                        }
                        [RelayCommand]
                        public void Error()
                        {
                        }
                    }
                }
                

                效果

                添加和清空功能

                参考这个代码,但是我们需要修改一下对应的【Run】的颜色

                        /// 
                        /// 插入文本信息
                        /// 
                        /// 
                        /// 
                        private void InsertMsg(string msg, SolidColorBrush color)
                        {
                            var text = new Run(msg);
                            text.Foreground = color;
                            var insert = new Paragraph(text);
                            ConsoleView.FlowDocument.Blocks.Add(insert);
                        }
                        [RelayCommand]
                        public void Debug()
                        {
                        	//这里只是为了更好的区分,显示我们修改了颜色颜色
                            InsertMsg("Debug",new SolidColorBrush(Colors.Red));
                        }
                

                清空直接用官方文档的方法就可以了

                        [RelayCommand]
                        public void Clean()
                        {
                            ConsoleView.FlowDocument.Blocks.Clear();
                        }
                

                完善代码

                namespace WpfApp.ViewModels
                {
                    public partial class ConsoleViewModel : ObservableObject
                    {
                        public enum TextType { debug, info, warning, error }
                        public ConsoleView ConsoleView { get; set; }
                        public ConsoleViewModel()
                        {
                        }
                        [RelayCommand]
                        public void Clean()
                        {
                            ConsoleView.FlowDocument.Blocks.Clear();
                        }
                        [RelayCommand]
                        public void Debug()
                        {
                            InsertMsg("Debug", new SolidColorBrush(Colors.Black));
                        }
                        [RelayCommand]
                        public void Info()
                        {
                            InsertMsg("Info", new SolidColorBrush(Colors.Green));
                        }
                        [RelayCommand]
                        public void Warning()
                        {
                            InsertMsg("Warning", new SolidColorBrush(Colors.YellowGreen));
                        }
                        [RelayCommand]
                        public void Error()
                        {
                            InsertMsg("Error", new SolidColorBrush(Colors.Red));
                        }
                        /// 
                        /// 插入文本信息
                        /// 
                        /// 
                        /// 
                        private void InsertMsg(string msg, SolidColorBrush color)
                        {
                            var text = new Run(msg);
                            text.Foreground = color;
                            var insert = new Paragraph(text);
                            ConsoleView.FlowDocument.Blocks.Add(insert);
                        }
                    }
                }
                

                额外功能添加

                移动到底部

                /// 
                /// 插入文本信息
                /// 
                /// 
                /// 
                private void InsertMsg(string msg, SolidColorBrush color)
                {
                    var text = new Run(msg);
                    text.Foreground = color;
                    var insert = new Paragraph(text);
                    ConsoleView.FlowDocument.Blocks.Add(insert);
                    //滚动到文档底部
                    ConsoleView.RichTextBox.ScrollToEnd();
                }
                

                添加样式

                /// 
                /// 插入文本信息
                /// 
                /// 
                /// 
                private void InsertMsg(string msg, SolidColorBrush color)
                {
                    var text = new Run(msg);
                    //添加样式
                    text.FontWeight = FontWeights.Bold;
                    text.Foreground = color;
                    var insert = new Paragraph(text);
                    //添加样式
                    insert.Margin = new Thickness(0, 5, 0, 0);
                    ConsoleView.FlowDocument.Blocks.Add(insert);
                    ConsoleView.RichTextBox.ScrollToEnd();
                }
                

                总结

                这里我可以设置到Ioc容器里面,但是这样会导致博客太过于复杂,这里我就不展开说明了。

The End
微信