WPF 自定义彩色控制台功能
文章目录
- 前言
- 环境
- 流内容
- 一个简单的控制台
- 自动添加数据
- 无法添加数据模板
- 代码添加参数
- 简单的案例
- 添加和清空功能
- 完善代码
- 额外功能添加
- 移动到底部
- 添加样式
- ���结
前言
在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