WPF 自定义彩色控制台功能

news/2025/3/14 18:23:59/

文章目录

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

前言

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

环境

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

流内容

流内容 官方文档

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

在这里插入图片描述

在这里插入图片描述

一个简单的控制台

<RichTextBox><FlowDocument x:Name="FlowDocument"><Paragraph><Run Text="Debug" Foreground="Black"/></Paragraph><Paragraph><Run Text="Info"Foreground="Green" /></Paragraph><Paragraph><Run Text="Warning"Foreground="Yellow" /></Paragraph><Paragraph><Run Text="Error"Foreground="Red" /></Paragraph></FlowDocument>
</RichTextBox>

在这里插入图片描述

自动添加数据

无法添加数据模板

【流内容】这个是一个特殊的集合,是无法添加控件模板的
在这里插入图片描述
在这里插入图片描述

代码添加参数

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

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

在这里插入图片描述

简单的案例

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

<UserControl x:Class="WpfApp.Views.ConsoleView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:WpfApp.Views"xmlns:hc="https://handyorg.github.io/handycontrol"xmlns:wpfEx="clr-namespace:WpfApp.WpfExtesion"xmlns:viewModels="clr-namespace:WpfApp.ViewModels"mc:Ignorable="d"d:DesignHeight="450"d:DesignWidth="800"><UserControl.DataContext><viewModels:ConsoleViewModel x:Name="ViewModel" /></UserControl.DataContext><DockPanel><StackPanel DockPanel.Dock="Top"Orientation="Horizontal"><Button Content="Debug"Margin="5"Command="{Binding DebugCommand}" /><Button Content="Info"Margin="5"Command="{Binding InfoCommand}" /><Button Content="Warning"Margin="5"Command="{Binding WarningCommand}" /><Button Content="Error"Margin="5"Command="{Binding ErrorCommand}" /><Button Content="Clean"Margin="5"Command="{Binding CleanCommand}" /></StackPanel><RichTextBox><FlowDocument x:Name="FlowDocument"><Paragraph><Run Text="Debug" Foreground="Black"/></Paragraph><Paragraph><Run Text="Info"Foreground="Green" /></Paragraph><Paragraph><Run Text="Warning"Foreground="YellowGreen" FontWeight="Bold" /></Paragraph><Paragraph><Run Text="Error"Foreground="Red" /></Paragraph></FlowDocument></RichTextBox></DockPanel>
</UserControl>
namespace WpfApp.Views
{/// <summary>/// ConsoleView.xaml 的交互逻辑/// </summary>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】的颜色

在这里插入图片描述

        /// <summary>/// 插入文本信息/// </summary>/// <param name="msg"></param>/// <param name="color"></param>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));}/// <summary>/// 插入文本信息/// </summary>/// <param name="msg"></param>/// <param name="color"></param>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);}}
}

在这里插入图片描述

额外功能添加

移动到底部

在这里插入图片描述

/// <summary>
/// 插入文本信息
/// </summary>
/// <param name="msg"></param>
/// <param name="color"></param>
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();
}

添加样式

/// <summary>
/// 插入文本信息
/// </summary>
/// <param name="msg"></param>
/// <param name="color"></param>
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容器里面,但是这样会导致博客太过于复杂,这里我就不展开说明了。


http://www.ppmy.cn/news/1373731.html

相关文章

跟着cherno手搓游戏引擎【27】升级2DRenderer(添加旋转)

水节&#xff0c;添加了旋转的DrawQuad&#xff1a; Renderer2D.h: #pragma once #include "OrthographicCamera.h" #include"Texture.h" namespace YOTO {class Renderer2D{public://为什么渲染器是静态的&#xff1a;static void Init();static void …

CCF CSP 202006-4 1246 (100分详细题解,矩阵乘法+快速幂)

202006-4 1246 &#xff08;100分详细题解&#xff0c;矩阵乘法快速幂&#xff09; 可以先看下csp官方的思路讲解&#xff0c;大思路是状态转移&#xff0c;先看下面s<2的情况 1 -> 2 2 -> 4 4 -> 16 6 -> 6 64 4 16 -> 26&#xff08;不考虑2&#xff0c;6…

C语言从入门到精通 第八章(用函数实现模块化程序设计)

一、函数的定义 1、概述 &#xff08;1&#xff09;函数是一个可以独立完成某个功能的语句块&#xff0c;其主要作用是将复杂程序拆成若干易于实现的子程序。 &#xff08;2&#xff09;在C语言中&#xff0c;函数分为标准函数&#xff08;又称为预定义函数&#xff09;和用…

【计算机网络】IO多路转接之epoll

文章目录 一、epoll的相关系统调用二、epoll工作原理三、epoll的优点(和 select 的缺点对应)四、epoll工作方式五、epoll服务器1.Sock.hpp2.Log.hpp3.Err.hpp4.epollServer.hpp5.epollServer.cc 一、epoll的相关系统调用 按照man手册的说法: 是为处理大批量句柄而作了改进的po…

基于OpenCV的图形分析辨认04

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

事务(transaction)

事务&#xff0c;什么是事务&#xff0c;事务就是由单独单元的一个或多个sql语句组成&#xff0c;在这个单元中&#xff0c;每个sql语句都是相互依赖的。而整个单独单元是作为一个不可分割的整体存在&#xff0c;类似于物理当中的原子&#xff08;一种不可分割的最小单位&#…

Node.js和浏览器在JavaScript运行环境方面存在一些区别和联系

Node.js和浏览器在JavaScript运行环境方面确实存在一些区别和联系。 首先&#xff0c;让我们理解一下Node.js和浏览器的运行环境。Node.js是一个基于Chrome的V8引擎的服务器端JavaScript运行环境&#xff0c;允许开发者在服务器端运行JavaScript代码&#xff0c;并且提供了一系…

【MATLAB源码-第158期】基于matlab的海马优化算法(SHO)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 海马优化器&#xff08;Sea Horse Optimizer, SHO&#xff09;是一种近年来提出的新型启发式算法&#xff0c;其设计灵感来源于海洋中海马的行为模式&#xff0c;特别是它们在寻找食物和伴侣时表现出的独特策略。海马因其独特…