下面函数是经常用到的计算字串长度的方法:

        private double MeasureTextWidth(String str, string fontName, double fontsize, double width)
        { 
            double width = -1;     
            try
            {
                System.Drawing.Graphics graphics = System.Drawing.Graphics.FromHwnd(m_hWnd);
                graphics.PageUnit = System.Drawing.GraphicsUnit.Point;
                System.Drawing.Font font = new System.Drawing.Font(fontName, (float)fontsize);

System.Drawing.SizeF size = graphics.MeasureString(str, font);

width = size.width;

font.Dispose();
                graphics.Dispose();
            }
            catch (System.Exception e)
            {
            }
            return width;
        }

但是事实上,Graphics.MeasureString并不可靠,在不同的SKU下得到的结果会不同,原因不明,可能跟显卡驱动也会有关系。今天尝试新的方法经测试有效,贡献出来:

        private double MeasureTextWidth(string text, double fontSize, string fontFamily)
        {
            FormattedText formattedText = new FormattedText(
            text,
            System.Globalization.CultureInfo.InvariantCulture,
            FlowDirection.LeftToRight,
            new Typeface(fontFamily.ToString()),
            fontSize,
            Brushes.Black
            );
            return formattedText.WidthIncludingTrailingWhitespace;
        }

另,附送枚举已安装字体的方法:

                System.Drawing.FontFamily[] fontFamilies;
                InstalledFontCollection installedFontCollection = new InstalledFontCollection();
                fontFamilies = installedFontCollection.Families;

int count = fontFamilies.Length;
                log("fontFamilies.Length=" + fontFamilies.Length);
                for (int i = 0; i < count; i++)
                {
                    fontName = fontFamilies[i].Name;
                    log("fontName: " + fontName);
                }

 
参考自:http://zwkufo.blog.163.com/blog/static/258825120116663748213/

C#/WPF 计算字串的真实长度,调整控件的宽度的更多相关文章

  1. python-Levenshtein几个计算字串相似度的函数解析

    linux环境下,没有首先安装python_Levenshtein,用法如下: 重点介绍几个该包中的几个计算字串相似度的几个函数实现. 1. Levenshtein.hamming(str1, str ...

  2. WPF教程十一:简单了解并使用控件模板

    WPF教程十一:简单了解并使用控件模板 这一章梳理控件模板,每个WPF控件都设计成无外观的,但是行为设计上是不允许改变的,比如使用Button的控件时,按钮提供了能被点击的内容,那么自由的改变控件外观 ...

  3. WPF中, 启用添加到RichTextBox中的控件

    原文:WPF中, 启用添加到RichTextBox中的控件   WPF中, 启用添加到RichTextBox中的控件                                           ...

  4. WPF编程,通过Double Animation动态旋转控件的一种方法。

    原文:WPF编程,通过Double Animation动态旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...

  5. WPF编程,通过Double Animation动态更改控件属性的一种方法。

    原文:WPF编程,通过Double Animation动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/a ...

  6. WPF编程,通过Double Animation动态缩放控件的一种方法。

    原文:WPF编程,通过Double Animation动态缩放控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...

  7. WPF 自定义ComboBox样式,自定义多选控件

    原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...

  8. WPF中动态加载XAML中的控件

    原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...

  9. Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)

    原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) ------------------------------ ...

随机推荐

  1. Make chrome extension

    How to Make a Chrome Extension. https://robots.thoughtbot.com/how-to-make-a-chrome-extension Skip to ...

  2. Linux中的zip与scp

    现在只是学会基本操作,不深究各个参数的含义 一般操作目录时,都有一个-r代表递归操作整个目录下的所有内容 压缩一个目录test到test.zip zip -r test test.zip 解压test ...

  3. git自己操作命令组集合

    git自己操作命令组集合 一.总结 一句话总结: 1.官方有非常详细的中文文档资料,任何组件或者插件记得看有没有文档资料,这个用起来快,配合百度. 2.git clone命令是直接把git仓库上面的代 ...

  4. Silverlight三维透视+倒影效果

    原文:Silverlight三维透视+倒影效果 知识概要: 1.使用2D内容创建3D体验,了解图像的PlaneProjection属性,具体内容读者自己查看文档. 2.Silverlight图形图形的 ...

  5. 基于C#反射机制的工厂模式

    简单介绍 反射提供了描写叙述程序集.模块和类型的对象(Type 类型). 能够使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或訪问其字段和属性. 假设代码中使用了特 ...

  6. angularjs1.6 制作流程图,启动流程,流程设置

    话不多说,我们先来看一下效果图: 点击添加按扭要增加一个,可以叠加 代码如下: server.server().addprojectrooml({ type: , processName: $scop ...

  7. 城市三级联动 AJAX-原生js封装

    话不多说我们先来一张效果图给大家看一下: html代码如下: <!DOCTYPE html><html lang="en"><head> < ...

  8. 【t045】细菌

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 近期,农场出现了D (1<= D <=15)种细菌.John 要从他的 N (1<= ...

  9. 深度剖析:最新云端开发工具如何实现敏捷+DevOps开发落地

    相信很多软件开发人员们对今年国内新兴的云端开发工具——华为软件开发云都有耳闻,有些人可能还免费体验过,由于它5人以下的团队是免费使用的,很庆幸本人的这个项目正好5个人,就注册使用了.下面就自己的使用心 ...

  10. Entity Framework知识小总结

    什么是Entity Framework EF是微软主推的数据存取技术,在实际开发中,现在通常使用EF来构建应用程序的数据存取层,它是一个开源的“对象/关系映射(ORM:Object Relationa ...