C#/WPF 计算字串的真实长度,调整控件的宽度

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

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/

时间: 2024-10-05 11:03:40

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

WPF中的瀑布流布局(TilePanel)控件

最近在用wpf做一个metro风格的程序,需要用到win8风格的布局容器,只能自己写一个了.效果如下 用法 : <local:TilePanel                          TileMargin="1"                         Orientation="Horizontal"                         TileCount="4" > //todo 放置内容 //loc

WPF系列之二:解耦View层控件事件与ViewModel层事件的响应

以前的做法: 1.当项目的时间比较紧迫的时候,对UI层中控件的事件的处理,往往采取的是类似Winform中最简单的做法,直接做一个事件的Handler直接去调用VM层的方法. 2.控件只有一个Command属性,其它的事件的处理方法没有办法和ViewModel层进行解耦的时候往往也采取上面提到的方法. 如下图所示: 新的做法: 为了实现事件的处理与View层的解耦,我们可以利用WPF提供的附加属性来为需要的事件添加附加行为.附加属性扮演了一个在View层与Model层牵线的角色. 需要下面三个步

在WPF中获取DataGridTemplateColumn模板定义的内容控件

xaml格式描述: <DataGrid Name="dataGrid" Grid.Row="1" ItemsSource="{Binding}"  >            <DataGrid.Columns>              <DataGridTemplateColumn Header="描述">                    <DataGridTemplateCo

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

原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) --------------------------------------------------------------------------------引用或转载时请保留以下信息:大可山?[MSN:a3news(AT)hotmail.com] http://www.zpxp.com?http://www.brawdraw.com萝卜鼠在线图形图像处理

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

原文:WPF编程,通过Double Animation动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87251422 DoubleAnimation类指定起始值(From="30").终点值(To="300").时间(Duration="3"),以及动画结束应该如何(FillBehavior="Stop&qu

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

原文:WPF编程,通过Double Animation动态旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87259162 ? ?1.控件旋转,可直接调用.需要将控件的名称,旋转的角度,时间等参数传进去. /// <summary> /// 控件绕中心旋转动画 /// </summary> /// <param name="element"

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

原文:WPF编程,通过Double Animation动态缩放控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87260143 ? ?1.控件缩放,可直接调用.需要将控件的名称,缩放的位数,时间等参数传进去. /// <summary> /// 控件绕中心缩放动画 /// </summary> /// <param name="element"

WPF 后台获得 数据模板里的内容控件(DataTemplate)

原文:WPF 后台获得 数据模板里的内容控件(DataTemplate) 假如 <Window.Resources> 里 有一个 Datatemplate 我想获得TextBlock XAML <DataTemplate x:Key="dtName"> <TextBlock Text="content"/> </DataTemplate> 后台代码 DataTemplate d = this.FindResource(

WPF学习(三)--Menu和TabControl控件介绍

Menu Menu提供了菜单栏方式的多级菜单的管理和操作: 这里对Menu的样式不做任何的定制和管理 下面来对Menu进行测试: 将Menu添加到页面中 运行后,效果如下: 这里没有考虑界面效果和样式. TabControl TabControl是非常常见和有用的控件, 数据控件 DataGrid DataGrid 是WPF中最常用的列表数据显示控件,该控件功能强大,并且拥有强大的可定制性 上面给出的是dataGrid的基本属性,下面我们通过设置样式,来设置下DataGrid的基本样式: 关于触