wpf中控件字体大小智能随着内容长度的变化也变化。

原创 2013年12月05日 14:37:02

在最近的工作中遇到一个需求,控件的fontsize 随着 content的内容变化而自动适应大小。

整理了一下, 首先是2个方法。


        /// <summary>
        /// Measures the size of the text.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <param name="fontFamily">The font family.</param>
        /// <param name="fontStyle">The font style.</param>
        /// <param name="fontWeight">The font weight.</param>
        /// <param name="fontStretch">The font stretch.</param>
        /// <param name="fontSize">Size of the font.</param>
        /// <returns></returns>
        private static Size MeasureTextSize(
            string text, FontFamily fontFamily,
            FontStyle fontStyle,
            FontWeight fontWeight,
            FontStretch fontStretch,
            double fontSize)
        {
            FormattedText ft = new FormattedText(text,
                                                 CultureInfo.CurrentCulture,
                                                 System.Windows.FlowDirection.LeftToRight,
                                                 new Typeface(fontFamily, fontStyle, fontWeight, fontStretch),
                                                 fontSize,
                                                 Brushes.Black);
            return new Size(ft.Width, ft.Height);
        }


        /// <summary>
        /// Get the required height and width of the specified text. Uses Glyph's
        /// </summary>
        private static Size MeasureText(string text, FontFamily fontFamily,
            FontStyle fontStyle, FontWeight fontWeight,
            FontStretch fontStretch, double fontSize)
        {
            Typeface typeface = new Typeface(fontFamily, fontStyle, fontWeight, fontStretch);
            GlyphTypeface glyphTypeface;


            if (!typeface.TryGetGlyphTypeface(out glyphTypeface))
            {
                return MeasureTextSize(text, fontFamily, fontStyle, fontWeight, fontStretch, fontSize);
            }


            double totalWidth = 0;
            double height = 0;


            for (int n = 0; n < text.Length; n++)
            {
                ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[text[n]];


                double width = glyphTypeface.AdvanceWidths[glyphIndex] * fontSize;


                double glyphHeight = glyphTypeface.AdvanceHeights[glyphIndex] * fontSize;


                if (glyphHeight > height)
                {
                    height = glyphHeight;
                }


                totalWidth += width;
            }


            return new Size(totalWidth, height);
        }


用来返回size 的大小/



   /// <summary>
        /// Limits the size of the control font.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <param name="fontFamily">The font family.</param>
        /// <param name="fontStyle">The font style.</param>
        /// <param name="fontWeight">The font weight.</param>
        /// <param name="fontStretch">The font stretch.</param>
        /// <param name="fontSize">Size of the font.</param>
        private static void LimitControlFontSize(
            string text,
            FontFamily fontFamily,
            FontStyle fontStyle,
            FontWeight fontWeight,
            FontStretch fontStretch,
            double fontSize, double width)
        {
            for (int i = Convert.ToInt32(fontSize); i > MinFontSize; i--)
            {
                Size size = MeasureText(text, fontFamily, fontStyle,
                    fontWeight, fontStretch, i);


                if (width > size.Width)
                {
                    lastFontSize = i-1;
                    return;
                }
            }


            lastFontSize = MinFontSize;
            LastToolTipContent = text;


            for (int i = text.Length; i > 0; i--)
            {
                var textTemp = text.Substring(0, i);
                Size size = MeasureText(textTemp, fontFamily, fontStyle,
                    fontWeight, fontStretch, lastFontSize);


                if (width > size.Width + 10)
                {
                    lastControlContent = textTemp + "...";
                    return;
                }
            }
        }

用来控制大小。 

wpf-MVVM界面自适应:界面自适应及字体自适应

1,界面自适应 界面先划分Region,每个填充Region的View不设置Width属性,即可按照Region划分的比例,自适应屏幕分辨率 2.字体自适应 程序根据屏幕分辨率分别计算4种字体大小...
  • ceasadan
  • ceasadan
  • 2016年10月11日 17:01
  • 1977

wpf 根据不同屏幕分辨率自动适应屏幕

问题 0 登录进行投票 界面布局是默认采用的1920*1080的分辨率布局的,现在想自动适应不同的分辨率下的屏幕。 ...
  • younger_z
  • younger_z
  • 2014年12月14日 21:14
  • 7080

WPF设置字体颜色大小对话框控件

  • 2014年01月13日 15:47
  • 30KB
  • 下载

WPF 字体设置

WPF 主界面 更换字体 可全局 但是有的时候有的窗体 字体还是没变 可以做全局样式...
  • q465162770
  • q465162770
  • 2015年11月25日 14:55
  • 1390

WPF中如何调整TabControl的大小,使其跟随Window的大小而改变?

多年不写技术博客,手生的很,也不知道大家都关注什么,最近在研究Wpf及3d模型的展示,碰到很多问题,这个是最后一个问题,写出来小结一下。。。。。。 WPF中如何调整TabControl的大小,使...
  • lb_zhao
  • lb_zhao
  • 2014年03月09日 16:07
  • 11418

WPF 自定义控件依赖属性怎么实时变化?

WPF自定义控件依赖属性怎么实时变化。
  • lvguoshan
  • lvguoshan
  • 2015年08月21日 16:01
  • 2622

C#控件大小(及字体)随窗口改变自动缩放

  • 2015年12月09日 11:05
  • 2KB
  • 下载

WPF控件内容自动缩放及放大镜

一、功能、布局描述 1、使用Grid的GridSplitter实现可拖拽分隔栏效果。当ShowsPreview设置为True时,拖拽过程中不会刷新(控件内容要等到鼠标释放时才变化);当ShowsPr...
  • LH806732
  • LH806732
  • 2014年08月15日 09:14
  • 6536

wpf 照片自适应变化

用wpf做一个客户端,接收服务器发来的三种人员信息(含图片),分别显示在三栏中。 要求: 1.可以通过设置项,来选择显示那种图片。 2.每栏的最小可显示两张照片。 3.每栏中不能有半张脸,即每...
  • bornonew
  • bornonew
  • 2016年05月05日 17:06
  • 2015

WPF 下的自定义控件以及 Grid 中控件的自适应

本文主要总结使用 C# 及 .NET 在 WPF 框架下,自定义控件的绘制以及窗体中控件的自适应。...
  • llmmll08
  • llmmll08
  • 2016年10月12日 16:39
  • 5951
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wpf中控件字体大小智能随着内容长度的变化也变化。
举报原因:
原因补充:

(最多只允许输入30个字)