首页 > 解决方案 > 在 WinForm 中获取 textBlock 的正确宽度

问题描述

我有一个 WPF 控件,它创建动态的一些 textBlocks 并增加字体大小,直到 textBlocks 具有最大字体大小以适合父级。

我正在使用以下方法来获取具有特定 fontSize 的 textBlock 的大小:

 private Size MeasureTextBlockSize(TextBlock textBlock)
    {
        // Measured Size is bounded to be less than maxSize
        Size maxSize = new Size(double.PositiveInfinity, double.PositiveInfinity);
        textBlock.Measure(maxSize);
        return textBlock.DesiredSize;
    }

在 WPF 中一切正常,但是当我在 WinForm 应用程序中使用控件时,文本将大于其父级。这意味着该方法无法正常工作。

我尝试了与标签相同的方法,但结果相同。

你知道为什么会发生这种情况,或者我该如何解决?

为了更好地理解我的问题,我将附上一些来自 WPF 和 WinForm 的图像:

这是 WPF:

在此处输入图像描述

这是 WinForm:

在此处输入图像描述

标签: wpfwinformslabelsizetextblock

解决方案


您可以使用 Graphics 对象使用MeasureString()以下方法测量字符串:

private void Form1_Load(object sender, EventArgs e)
{
    string testStr = "0#2" + Environment.NewLine
        + "1400" + Environment.NewLine
        + "800";

   var rows = testStr.Split('\n');
    // use graphics object to measure the string using MeasureString() method
    Graphics g = this.CreateGraphics();

    foreach (var row in rows)
    {
        var strSize = g.MeasureString(row, label1.Font);
        Debug.WriteLine("text: {0} width: {1} height: {2}",row, strSize.Width.ToString(),strSize.Height.ToString());
    }

}

输出:

文字:0#2 宽度:22.56396 高度:13.82519
文字:1400 宽度:28.86426 高度:13.82519
文字:800 宽度:22.56754 高度:13.82519


推荐阅读