WPF 自定义彩色控制台功能

news2025/3/12 1:45:29

文章目录

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

前言

在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.coloradmin.cn/o/1495472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】十大排序算法之 堆排序 计数排序

本次介绍内容参考自&#xff1a;十大经典排序算法&#xff08;C实现&#xff09; - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序…

腾轩科技传媒讲解律师事务所创建百度词条的流程

在当今信息爆炸的时代&#xff0c;律师事务所需要在互联网上留下自己的痕迹&#xff0c;为了提升品牌知名度和业务曝光度&#xff0c;很多律师事务所选择在百度百科创建词条。但是&#xff0c;创建词条并不是一件简单的事情&#xff0c;需要注意许多细节和规定。本文腾轩科技传…

美国站群服务器使用技巧与注意事项

美国站群服务器使用技巧与注意事项有哪些?RAKsmart小编为您整理发布美国站群服务器使用技巧与注意事项&#xff0c;希望对您有帮助。 美国站群服务器的使用技巧主要包括远程管理、灵活配置和备份还原&#xff0c;具体如下&#xff1a; 1. **远程管理**&#xff1a;用户可以通过…

SpringBoot集成ElasticSearch(ES)

ElasticSearch环境搭建 采用docker-compose搭建&#xff0c;具体配置如下&#xff1a; version: 3# 网桥es -> 方便相互通讯 networks:es:services:elasticsearch:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/elasticsearch:7.14.1 # 原镜像elasticsearch:7.…

Python】深度学习基础知识——随机梯度下降详解和示例

本文通过原理和示例对随机梯度下降进行了详解&#xff0c;并和梯度下降进行了对比分析&#xff0c;简单易懂。 随机梯度下降原理示例 动态学习率动态学习率示例 总结 随机梯度下降 原理 示例 import torch import torch.nn as nn import matplotlib.pyplot as pltdef train_2…

Vue.js大师: 构建动态Web应用的全面指南

VUE ECMAScript介绍什么是ECMAScriptECMAScript 和 JavaScript 的关系ECMAScript 6 简介 ES6新特性let基本使用const不定参数箭头函数对象简写模块化导出导入a.jsb.jsmain.js Vue简介MVVM 模式的实现者——双向数据绑定模式 Vue环境搭建在页面引入vue的js文件即可。创建div元素…

简单两步,从补税到退税

大家好&#xff0c;我是拭心。 最近到了一年一度的个人所得税年度申报时期&#xff0c;有人可以退好几千&#xff0c;而有的人则需要补上万元&#xff0c;人类的悲喜这一刻并不相通。 我申报的时候&#xff0c;提示我需要补税一万多&#xff0c;心有不甘但差一点就认了&#xf…

瑞芯微第二代8nm高性能AIOT平台 RK3576 详细介绍

RK3576处理器 RK3576瑞芯微第二代8nm高性能AIOT平台&#xff0c;它集成了独立的6TOPS&#xff08;Tera Operations Per Second&#xff0c;每秒万亿次操作&#xff09;NPU&#xff08;神经网络处理单元&#xff09;&#xff0c;用于处理人工智能相关的任务。此外&#xff0c;R…

07-prometheus的自定义监控-pushgateway工具组件

一、概述 pushgateway用于自定义监控节点、节点中服务的工具&#xff0c;用户可以通过自定义的命令获取数据&#xff0c;并将数据推送给pushgateway中&#xff1b; prometheus服务&#xff0c;从pushgateway中获取监控数据&#xff1b; 二、部署pushgateway 我们可以“随便”找…

分库分表浅析原理

数据库存放数据大了&#xff0c;查询等操作就会存在瓶颈&#xff0c;怎么办&#xff1f; 1. 如果是单张表数据大了&#xff0c;可以在原有库上新建几张表table_0、table1、table2、.....table_n 写程序对数据进行分表&#xff1a; --这里提供一种一种分表策略,这里只需维护分…

VR全景数字工厂,制造业企业线上营销新助手

VR全景技术逐渐渗透到各行各业&#xff0c;其中&#xff0c;很多实体工厂的线上营销宣传也借助720云VR全景技术也迎来了新的变革。 一、VR全景技术的独特魅力 VR全景技术是一种基于虚拟现实技术的全新视觉呈现方式&#xff0c;能够为用户带来身临其境的沉浸式体验。通过VR全景…

Clion开发STM32之printf的缓冲区验证方式

前言 clion开发stm32时&#xff0c;涉及到printf函数的重写&#xff0c;一般我们重写__io_putchar函数经发现printf函数在没有加换行符时&#xff0c;数据不会立刻通过串口发送数据&#xff0c;而是等到1024字节之后发送数据 测试 主程序 现象 debug调试 不加换行的情况 总…

985硕的4家大厂实习与校招经历专题分享(part1)

先简单介绍一下我的个人经历&#xff1a; 985硕士24届毕业生&#xff0c;实验室方向:CV深度学习 就业&#xff1a;工程-java后端 关注大模型相关技术发展 校招offer: 阿里巴巴 字节跳动 等10 研究生期间独立发了一篇二区SCI 实习经历:字节 阿里 京东 B站 &#xff08;只看大厂…

超简单Windows-kafka安装配置

参考大佬文章&#xff1a; Kafka&#xff08;Windows&#xff09;安装配置启动&#xff08;常见错误扫雷&#xff09;教程_kafka在windows上的安装、运行-CSDN博客Kafka&#xff08;Windows&#xff09;安装配置启动&#xff08;常见错误扫雷&#xff09;教程_kafka在windows上…

力扣爆刷第87天之hot100五连刷21-25

力扣爆刷第87天之hot100五连刷21-25 文章目录 力扣爆刷第87天之hot100五连刷21-25一、240. 搜索二维矩阵 II二、160. 相交链表三、206. 反转链表四、234. 回文链表五、141. 环形链表 一、240. 搜索二维矩阵 II 题目链接&#xff1a;https://leetcode.cn/problems/search-a-2d-…

解决cs不能生成Linux木马的问题

要解决的问题&#xff1a;众所周知&#xff0c;msf上面的shell或者是其他的shell想反弹给cs默认情况下是只支持windows的&#xff0c;因为cs的监听模块默认没有linux的&#xff0c;但是有些主机就是用linux搭建的&#xff0c;这可怎么办呢。就要用到一个插件CrossC2。 下载插件…

Qt 二维数组的访问与应用

配色方案有多种类型&#xff0c;可以根据不同的需求和应用场景来选择合适的配色方法。在柱状图、饼状图中都会用到不同的配色&#xff0c;本文将配色方案使用二维数组进行存储&#xff0c;对常用的配色进行了整理&#xff1a; 效果图 示例代码 void MainWindow::InitUI() {QS…

Rust入门:Rust如何调用C静态库的函数

关于Rust调用C&#xff0c;因为接口比较复杂&#xff0c;貌似Rust不打算支持。而对于C函数&#xff0c;则相对支持较好。 如果要研究C/Rust相互关系的话&#xff0c;可以参考&#xff1a; https://docs.rs/cxx/latest/cxx/ Rust ❤️ C 这里只对调用C静态库做一个最简短的介…

云原生架构设计:开放应用模型(OAM)的重要性与实践

在当今云计算时代&#xff0c;云原生架构已经成为许多企业追求的理想状态&#xff0c;在云原生架构设计中&#xff0c;开放应用模型是至关重要的一部分。本文灸哥将和你一起探讨开放应用模型的概念、意义以及实践方法&#xff0c;以帮助大家更好地理解和应用云原生架构中的开放…

lvs集群介绍

目录 一、LVS集群基本介绍 1、什么是集群 2、集群的类型 2.1 负载均衡群集&#xff08;Load Balance Cluster) 2.2 高可用群集(High Availiablity Cluster) 2.3 高性能运算群集(High Performance Computing Cluster) 3、负载均衡集群的结构 ​编辑 4、LVS集群类型中的…