Method的度量单位:String.Length

时间:2016-12-14 12:45:36

标签: c# winforms visual-studio

我正在尝试根据内容宽度设置标签的宽度(“label1”)。但每次我使用String.Length-Method获取字符串的长度时,宽度似乎太小而且我的字符串不适合标签。

  string anystring = "ThisIsMyString";
  int i = anystring.Length;
  label1.Text = anystring;
  label1.Width = i + 10; //I add +10 to have some buffer

String.Length和Label.Width的问题是否有不同的度量单位?有没有其他方法来处理这个? (我知道我可以简单地将零件留在我设置标签宽度的地方,但我想知道如何以好奇的方式做到这一点)

3 个答案:

答案 0 :(得分:4)

使用Windows在屏幕上显示时,确定文本的宽度大小的正确方法是使用Graphics.MeasureString

  

使用指定的Font绘制时测量指定的字符串。

原因是以下因素会影响您获得的确切尺寸:

  • 显然是文字
  • 使用的字体系列/类型
  • 使用的字体大小
  • 字体样式(粗体,斜体等)

这是一个非常简短的例子:

using (var f = new Font("Arial", 8.25f))
using (var g = Graphics.FromHwnd(IntPtr.Zero)) // Desktop
{
    SizeF size = g.MeasureString("Test", f);
}

显然,您应该使用从控件获取的Graphics对象,以及标签的字体(如果您要将其用于标签),以避免构造和使用上述对象。

答案 1 :(得分:2)

嗯,问题的答案很简短:

  

String.Length和Label.Width的问题是否有不同的度量单位?

是“是”。

有关Width媒体资源的详情,请参阅here;有关String.Length的详情,请参阅here

基本上:String.Length是指字符串中的字符数。 “ABC123”将返回6. Control.Width是以像素为单位的度量。并且由于不同的字体显示不同,因此尝试找出“X字体中的N个字符是Y像素”将会非常麻烦。 (编辑:那假设你正在使用单宽字体。如果没有,它甚至更多复杂,因为“iii”明显长于“aaa”。)

关于你的后续行动:

  

还有其他方法可以解决这个问题吗?

(编辑:在评论中提出想法后更改此部分)

1)将字符串写入图像文件

2)找到一个合适的库,可以从图像中的坐标或坐标集确定颜色

3)在你的图像的像素行上循环N次,其中N =图像的高度

4)寻找包含黑色像素的线条。我们不希望全白的线条只是我们文本上方和下方的“缓冲区”。

5)迭代当前行中的每个像素并存储第一个黑色像素的X坐标,然后将第一个黑色像素的X坐标存储在“临时”变量中

6)将lastBlackPixelfirstBlackPixel之间的差异存储在变量

7)比较图像中每一行的这两点之间的差异。如果当前差异大于largestKnownDifference,则使用新距离更新该变量。

这应该确定文本的宽度。或者可能迭代每一列并存储第一个黑色像素的位置,然后存储最后一列的位置以包含黑色像素?我不知道,我还没喝咖啡。有很多方法可以给猫皮肤。

答案 2 :(得分:2)

您可以查看标签autosize property。将此设置为true将使标签根据字符串大小调整其宽度。但是,对于很长的文本,这可能无法得到理想的结果。

如果您希望能够放置长文本而不是获得很长的标签,可以通过设置MaximumSize来包装文本。

<强> [编辑] 我认为测量可以通过设置自动调整后的宽度(后验)来完成。

另一种方法是尝试使用Graphics.MeasureString来测量文本,here使用实际文本和使用的字体来提供大小。可以找到一个完整的例子enter image description here(先验)。