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 根据不同屏幕分辨率自动适应屏幕

问题 0 登录进行投票 界面布局是默认采用的1920*1080的分辨率布局的,现在想自动适应不同的分辨率下的屏幕。 ...

c# 隐藏显示 任务栏

c# 隐藏显示 任务栏
  • wyq1153
  • wyq1153
  • 2016年11月07日 11:03
  • 537

【转】WPF MVVM 循序渐进 (从基础到高级) 【已翻译100%】【2】

原文地址:http://www.oschina.net/translate/wpf-mvvm-step-by-step-basics-to-advance-level?lang=chs&page=2#...
  • lzkqcc
  • lzkqcc
  • 2017年06月27日 10:29
  • 282

VB6中控件窗体大小自动变化

  • 2015年09月09日 11:50
  • 15KB
  • 下载

MFC中控件大小随对话框大小动态变化

首先在***Dlg.h头文件中定义 CRect m_rectmin;//用于存储初始化对话框的大小 CRect Button1Rectinit;//用于存储初始化控件的大小 然后定义一个变化函数...

Android设定字体大小,不随系统变化

在app开发中,我们经常会限定字体大小,不跟随系统设定的字号变化。所以在编写页面时,会经常使用dp,而不是sp;...

实现一段字符串中部分内容字体颜色大小变化

在label、button等等控件中,都可以对需要赋值的字符串设置字体属性,变量名为attributedText: @property(nullable, nonatomic,copy) NSAt...

Lazarus控件中控件尺寸变化的处理机制

TControl类通过Left、Top、Width和Height四个属性定义了控件的尺寸和位置信息,对这四个属性以及BoundsRect的修改(GetBoundsRect和SetBoundsRect函...
  • poolord
  • poolord
  • 2017年08月04日 23:26
  • 145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wpf中控件字体大小智能随着内容长度的变化也变化。
举报原因:
原因补充:

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