WPF 自定义彩色控制台功能

文章目录

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

前言

在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容器里面,但是这样会导致博客太过于复杂,这里我就不展开说明了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/445594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式执行引擎ray入门--(2)Ray Data

目录 一、overview 基础代码 核心API&#xff1a; 二、核心概念 2.1 加载数据 从S3上读 从本地读&#xff1a; 其他读取方式 读取分布式数据&#xff08;spark&#xff09; 从ML libraries 库中读取&#xff08;不支持并行读取&#xff09; 从sql中读取 2.2 变换数据…

html--彩虹马

文章目录 htmljscss 效果 html <!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>Rainbow Space Unicorn</title> <link rel"stylesheet" href"css/style.css"> &l…

TCP/IP 七层架构模型

传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。 套接字&#xff08;socket&#xff09;是一个抽象层&#xff0c;应用程序可以通过它发送或接收数据&#xff0c;可对其进行像对文…

【Linux】常用操作命令

目录 基本命令关机和重启帮助命令 用户管理命令添加用户&#xff1a;useradd 命令修改密码&#xff1a;passwd 命令查看登录用户&#xff1a;who 命令查看登录用户详细信息 :w切换用户 目录操作命令cdpwd命令目录查看 ls [-al] 目录操作【增&#xff0c;删&#xff0c;改&#…

NUMA(Non-Uniform Memory Access)架构的介绍

1. NUMA由来 最早的CPU是以下面这种形式访问内存的&#xff1a; 在这种架构中&#xff0c;所有的CPU都是通过一条总线来访问内存&#xff0c;我们把这种架构叫做SMP架构&#xff08;Symmetric Multi-Processor&#xff09;&#xff0c;也就是对称多处理器结构。可以看出来&…

Uniapp开发模板unibest

&#x1f3e0;简介 unibest 是一个集成了多种工具和技术的 uniapp 开发模板&#xff0c;由 uniapp Vue3 Ts Vite4 UnoCss uv-ui VSCode 构建&#xff0c;模板具有代码提示、自动格式化、统一配置、代码片段等功能&#xff0c;并内置了许多常用的基本组件和基本功能&#…

【PowerMockito:编写单元测试过程中原方法使用@Value注解注入的属性出现空指针】

错误场景 执行到Value的属性时会出现空指针&#xff0c;因为Value的属性为null 解决方法 在测试类调用被测试方法前&#xff0c;提前设置属性值&#xff0c;属性可以先自己定义好 ReflectionTestUtils.setField(endpointConnectionService, "exportUdpList", lis…

Linux 之七:Linux 防火墙 和进程管理

防火墙 查看防火墙 查看 Centos7 的防火墙的状态 sudo systemctl status firewalld。 查看后&#xff0c;看到active(running)就意味着防火墙打开了。 关闭防火墙&#xff0c;命令为&#xff1a; sudo systemctl stop firewalld。 关闭后查看是否关闭成功&#xff0c;如果…

【机器学习】一文掌握逻辑回归全部核心点(上)。

逻辑回归核心点-上 1、引言2、逻辑回归核心点2.1 定义与目的2.2 模型原理2.2.1 定义解析2.2.2 公式2.2.3 代码示例 2.3 损失函数与优化2.3.1 定义解析2.3.2 公式2.3.3 代码示例 2.4 正则化2.4.1 分类2.4.2 L1正则化2.4.3 L2正则化2.4.4 代码示例 3、总结 1、引言 小屌丝&#…

从空白镜像创建Docker hello world

文章目录 写在前面基础知识方法一&#xff1a;使用echo工具方法二&#xff0c;使用c语言程序方法三&#xff0c;使用汇编语言小结 写在前面 尝试搞了下docker&#xff0c;网上的教程大多是让下载一个ubuntu这种完整镜像&#xff0c;寥寥几篇从空白镜像开始创建的&#xff0c;也…

Oracle VM VirtualBox安装Ubuntu桌面版

背景&#xff1a;学习Docker操作 虚拟机软件&#xff1a;Oracle VM VirtualBox 7.0 系统镜像&#xff1a;ubuntu-20.04.6-desktop-amd64.iso 在Oracle VM VirtualBox新建一个虚拟电脑 选择好安装的目录和选择系统环境镜像 设置好自定义的用户名、密码、主机名 选择一下运行内…

执行除法运算返回浮点数结果operator.truediv()返回商的整数部分operator.floordiv()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 执行除法运算 返回浮点数结果 operator.truediv() 返回商的整数部分 operator.floordiv() 下列选项可以执行除法运算并得到浮点数结果的是&#xff08;&#xff09; import operator print(&…

凌鲨微应用架构

微应用是静态网页加上凌鲨提供的扩展能力而形成的一种应用&#xff0c;主要特点是开发便捷&#xff0c;安全。 微应用架构 组件说明 名称 说明 微应用 webview窗口&#xff0c;显示web服务器上的页面 接口过滤器 根据权限配置,屏蔽非授权接口访问 接口提供者 tauri注入…

文件操作上(c语言)

目录 1. 文件的作用2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开与关闭4.3.1 文件的打开模式4.3.2 实例代码 1. 文件的作用 使用文件可以将数据进行持久化的保…

P1958 上学路线

难度&#xff1a;普及- 题目描述 你所在城市的街道好像一个棋盘&#xff0c;有 a 条南北方向的街道和 b 条东西方向的街道。南北方向的 a 条街道从西到东依次编号为 1 到 a&#xff0c;而东西方向的 b 条街道从南到北依次编号为 1 到 b&#xff0c;南北方向的街道 i 和东西方…

【期刊】ACM Transactions on Privacy and Security

首页截图 subject areas 混合模式 根据官网介绍&#xff0c;本期刊不在金OA行列&#xff0c;可以自主选择出版模式。 出版方向 Topics of interest include 发文量 季刊&#xff0c;发文量很小 图像安全领域 未在今年发表图像安全领域论文。

ARM基础----STM32处理器操作模式

STM32处理器操作模式 Cortex-M处理器操作模式、特权等级和栈指针操作模式栈指针CONTROL寄存器异常压栈时的SP指针 Cortex-A 处理器运行模型寄存器组 Cortex-M处理器操作模式、特权等级和栈指针 操作模式 处理模式&#xff1a;执行中断服务程序等异常处理&#xff0c;处理器具有…

SpringBoot自定义banner,自定义logo

SpringBoot自定义banner&#xff0c;自定义logo 在线网站 http://www.network-science.de/ascii/?spma2c6h.12873639.article-detail.9.7acc2c9aSTnQdW https://www.bootschool.net/ascii?spma2c6h.12873639.article-detail.8.7acc2c9aSTnQdW https://patorjk.com/softwa…

继承杂谈。

内容一览 前言继承的概念及定义继承的意义继承关系及访问限定符父类和子类对象之间的转化继承后的作用域继承与有元继承与静态成员多继承继承和组合的区别&#xff1a;继承的总结和反思 前言 面向对象的三大特性&#xff1a;封装继承和多态&#xff0c;这三种特性优者很紧密地联…

基于神经网络的偏微分方程求解器再度取得突破,北大字节的研究成果入选Nature子刊

目录 一.引言:神经网络与偏微分方程 二.如何基于神经网络求解偏微分方程 1.简要概述 2.基于神经网络求解偏微分方程的三大方向 2.1数据驱动 基于CNN 基于其他网络 2.2物理约束 PINN 基于 PINN 可测量标签数据 2.3物理驱动(纯物理约束) 全连接神经网路(FC-NN) CN…