关闭

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

标签: wpf
1493人阅读 评论(0) 收藏 举报

在最近的工作中遇到一个需求,控件的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;
                }
            }
        }

用来控制大小。 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2218次
    • 积分:49
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档