WPF开发txt阅读器4:字体控件绑定

news2025/4/18 18:09:03

文章目录

    • 控件折叠
    • 字体尺寸绑定
    • 选择字体
    • 字体的中文名称

txt阅读器系列:

  • 需求分析和文件读写
  • 目录提取类💎列表控件与目录

控件折叠

作为一个txt阅读器,至少能够设置文字字体、尺寸,段落行间距等,还得有护眼模式等一系列功能,这也是最开始设计UI的时候,留下右侧空白的原因。但这些设置并不需要一直显示,故而在工具栏中给了一个👉按钮,用于开启或关闭右侧边栏。

为👉按钮添加事件btnCloseRight_Click,内容为

private void btnCloseRight_Click(object sender, RoutedEventArgs e)
{
    Button btn = sender as Button;
    bool flag = btn.Content.ToString() == "👈";
    btn.Content = flag ? "👉" : "👈";
    svRight.Visibility = flag ? Visibility.Visible : Visibility.Collapsed;
}

字体尺寸绑定

字体尺寸对阅读的影响是十分显著的,所以文本设置的第一条就是设置字体,其前端的设计逻辑如下

在这里插入图片描述

其中文本框中显示的是字体尺寸,+-号分别会让字体尺寸加一或者减一,而二者之间的滑动条则与文本框互相绑定,从而文本框显示的值就是滚动条中的值。具体实现方法如下

<StackPanel Orientation="Horizontal">
    <TextBlock Text="尺寸"/>
    <TextBox Width="50" Height="20" Text="{Binding Value, ElementName=sFontSize}"/>
    <Button Content="-" Width="20" Click="btnChangeFontSize_Click"/>
    <Slider x:Name="sFontSize" VerticalAlignment="Center" Width="150"
            Minimum="1" Maximum="100" Value="15" IsSnapToTickEnabled="True"/>
    <Button Content="+" Width="20" Click="btnChangeFontSize_Click"/>
</StackPanel>

其中,Text="{Binding Value, ElementName=sFontSize}"表示绑定了sFontSizeValue属性。

+-这两个按钮绑定的事件btnChangeFontSize_Click内容如下

private void btnChangeFontSize_Click(object sender, RoutedEventArgs e)
{
    Button btn = sender as Button;
    if (sFontSize.Value == 1)
        return;
    sFontSize.Value += btn.Content.ToString() == "+" ? 1 : -1;
}

此外,修改txt控件,将其FontSize也绑定到sFontSize上,具体变化为

<TextBox x:Name="txt" AcceptsReturn="True" TextWrapping="Wrap" 
         FontFamily="{Binding SelectedItem, Source=cbFont}"
         FontSize="{Binding Value, ElementName=sFontSize}"
         VerticalScrollBarVisibility="Auto"/>

效果如下

在这里插入图片描述

选择字体

字体就只有那么多种,选择字体显然用ComboBox比较合适,具体的控件设置如下

<StackPanel Orientation="Horizontal">
    <TextBlock Text="字体"/>
    <ComboBox x:Name="cbFont" Width="150"/>
</StackPanel>

然后在C#中添加绑定代码

public MainWindow()
{
    InitializeComponent();
    init();
}

public void init()
{
    foreach (var fm in Fonts.SystemFontFamilies)
        cbFont.Items.Add(fm.Source);
    cbFont.SelectedIndex = 0;
}

通过cbFont.Items.Add逐个添加字体,并且修改txt,使之与字体相绑定

<TextBox x:Name="txt" AcceptsReturn="True" TextWrapping="Wrap" 
         FontFamily="{Binding SelectedItem, ElementName=cbFont}"
         FontSize="{Binding Value, ElementName=sFontSize}"
         VerticalScrollBarVisibility="Auto"/>

最后效果如下

在这里插入图片描述

字体的中文名称

尽管我们的确得到了所有系统字体,但这些字体讲道理我们一个都不认识。而对于一个字体文件来说,除了英文名称外,还有不同语言的名称,封装在font.FamilyNames这个属性中。以中文为例,其对应的名称是zh-cn。为了得到中文名称,可以先创建一个中文的XmlLanguage,然后通过TryGetValue将中文名称试探性地输出到一个字符串中。这个TryGetValue的逻辑类似于int.TryParse,当转换成功时返回True,所以最终代码写成如下形式,这样一来,就可以显示所有中文字体了。

List<string> zhNames = new List<string>();
string tmpStr;
var ZH = XmlLanguage.GetLanguage("zh-cn");
foreach (var font in Fonts.SystemFontFamilies)
	if (font.FamilyNames.TryGetValue(ZH, out tmpStr))
		zhNames.Add(tmpStr);
cbFont.ItemsSource = zhNames;
cbFont.SelectedIndex = 0;

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

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

相关文章

2023 年最新版Java面试题及答案整理(完整版,超详细)

程序员一步入中年&#xff0c;不知不觉便会被铺天盖地的“危机感”上身&#xff0c;曾经的那个少年已经不在&#xff0c;时间就是这样公平。就算你能发明Java语言&#xff0c;随着时间的推移&#xff0c;你注定还是要成为慢慢变蔫的茄子&#xff0c;缓缓变黑的葡萄。 看着金九…

支付宝商家多个账号下的账单管理工具配置指南

大家好&#xff0c;我是小悟 阅读这篇文章之前&#xff0c;结合这篇【有了这个工具&#xff0c;支付宝商家多个账号下的账单管理更方便了】干货食用更佳。 商户管理 这里录入的是商家应用相关信息 商户名称&#xff1a;应用id所属的应用名称。 应用id&#xff1a;支付宝开放…

Django新手必看:如何创建应用和定义数据表。(详细讲解)

Django新手必看&#xff1a;如何创建应用和定义数据表。 1. Django创建应用1.1 创建应用1.2 应用的添加 2. Django ORM2.1 定义数据表2.2 定义项目数据表2.3 通用字段选项2.4 外键使用2.5 应用数据库迁移 &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &…

json-server操作restful

1.安装Node.js 默认已经内置npm&#xff0c;下载对应软件包直接安装即可。nodejs的官网 命令 描述 指令解释npm -v查看版本npm install <模块名>安装模块npm list查看所有全局安装的模块npm list -g查看某个模块的版本号npm install --save <模块名>在package.js…

【大模型】开源大模型汇总以及微调策略

目录 前言LLaMAstanford AlpacaGuanacoVicunaChinese-LLaMA-AlpacaChinese-VicunaLuotuo-Chinese FalconOpenBuddy-Falcon ChatGLM && VisualGLMMOSSAquilaPandaGPTTigerBot模型微调策略LoRAQLORAP-tuningv2 前言 自从ChatGPT出世以来&#xff0c;各个大厂/研究院都纷…

Hugging News #0609: 最新代码生成模型 StarCoder+ 和 StarChat Beta 重磅发布!

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」&#xff0c;本期 Hugging News 有哪些有趣的消息…

SG90舵机介绍

SG90舵机简介 SG90舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;适用于那些需要角度不断变化并可以保持的控制系统。在机器人机电控制系统中&#xff0c;舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构&#x…

耗时一个月,整理了这份大厂Java面试 / 学习指南,共计1500+ 题全面解析

程序员一步入中年&#xff0c;不知不觉便会被铺天盖地的“危机感”上身&#xff0c;曾经的那个少年已经不在&#xff0c;时间就是这样公平。就算你能发明 Java 语言&#xff0c;随着时间的推移&#xff0c;你注定还是要成为慢慢变蔫的茄子&#xff0c;缓缓变黑的葡萄。 看着金…

AI不能做什么?

什么是非人工智能 每个行业都需要的 3 种人为驱动的决策能力 布兰代斯马歇尔 支持统计数据的研究报告预计高度依赖AI的未来。 • 2018年,麦肯锡全球研究院发布了一份《工作未来报告》,估计到2030年,全球将有4亿人被AI系统、工具和平台取代。 • 2023年3月,高盛发布了其《全球经…

Typora安装使用

Typora安装使用 1、概述 因为本人电脑是Mac笔记本&#xff0c;所以本文介绍下Mac M1芯片下Typora的安装使用以及在线插件的安装。 2、安装Typora 下载Typora 1.5.8&#xff1a;下载 Typora 1.5.8 - 马可菠萝 完成安装。 自定义下载喜欢的主题&#xff1a;点击文件->偏好…

day10——线性回归的改进之岭回归

线性回归的改进之岭回归 一、过拟合和欠拟合二、正则化类别三、岭回归四、实操&#xff1a;波士顿房价预测 一、过拟合和欠拟合 1&#xff0c;欠拟合 如下所示&#xff0c;机器学习到的天鹅特征太少了&#xff0c;导致区分标准太粗糙&#xff0c;不能准确识别出天鹅。 2&…

asp.net归宿管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net归宿管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net归宿管理系统VS开发sqlserver数…

Android垃圾分类助手APP(Java+Android Studio+SQLite)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;69垃圾 获取完整源码源文件说明文档报告数据库文件等 开发运行环境 开发语言&#xff1a;Java 开发工具&#xff1a;Android Studio 模拟器&#xff1a;雷电模拟器9 数据库&#xff1a;SQLite 使用的核心类及组件 Activ…

广告数仓:采集通道创建

系列文章目录 广告数仓&#xff1a;采集通道创建 文章目录 系列文章目录前言一、环境和模拟数据准备1.hadoop集群2.mysql安装3.生成曝光测试数据 二、广告管理平台数据采集1.安装DataX2.上传脚本生成器3.生成传输脚本4.编写全量传输脚本 三、曝光点击检测数据采集1.安装Zookee…

CentOS6.10上离线安装ClickHouse19.9.5.36并修改默认数据存储目录

背景 在一台装有 CentOS6.10 操作系统的主机上安装 ClickHouse &#xff08;其实本来计划是先安装 Docker &#xff0c;然后在 Docker 中快速启动 ClickHouse 的&#xff0c;但是由于 CentOS6 对 Docker 支持不好&#xff0c;就直接在系统上装 ClickHouse 吧&#xff09;&…

jvm 命令和工具, jvm 堆 内存泄露 fullgc

目录 堆太大? 堆内存分析工具 MAT JProfiler ZProfiler - 线上的mat - 已进化为Grace EagleEye-MProf - 命令行 jhat jvisual 问题 w使用JProfiler和MAT打开内存超大的hprof文件时报错的解决方案_hprof太大_CoderBruis的博客-CSDN博客 很简单,把jvm参数调整下,设置小…

vue3---模板引用 nextTick

目录 模板引用--ref 访问模板引用 v-for 中的模板引用 函数模板引用 组件上的 ref 简单理解Vue中的nextTick 示例 二、应用场景 三、nextTick源码浅析 实战 --- vue3实现编辑与查看功能 模板引用--ref 虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作&…

TOF激光雷达告别“技术路线之争”

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 编辑 | 苏清涛 两三年前&#xff0c;在提起激光雷达时&…

067:cesium flyto一个具体的实体位置

第067个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置飞行定位功能,飞行到一个实体的区域。viewer.flyTo 函数接受实体、EntityCollection、DataSource、Cesium3DTilset 等。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果…

8.Nginx Rewrite

文章目录 Nginx Rewrite常用Nginx的正则表达式locationlocation大致可以分为三类location常用的匹配规则location优先级location示例说明实际网站使用中&#xff0c;至少有三个匹配规则定义 Rewriterewrite跳转实现rewrite执行顺序如下rewrite示例基于域名的跳转基于客户端IP访…