我正在尝试根据内容宽度设置标签的宽度(“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的问题是否有不同的度量单位?有没有其他方法来处理这个? (我知道我可以简单地将零件留在我设置标签宽度的地方,但我想知道如何以好奇的方式做到这一点)
答案 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)将lastBlackPixel
和firstBlackPixel
之间的差异存储在变量
7)比较图像中每一行的这两点之间的差异。如果当前差异大于largestKnownDifference
,则使用新距离更新该变量。
这应该确定文本的宽度。或者可能迭代每一列并存储第一个黑色像素的位置,然后存储最后一列的位置以包含黑色像素?我不知道,我还没喝咖啡。有很多方法可以给猫皮肤。
答案 2 :(得分:2)
您可以查看标签autosize property。将此设置为true将使标签根据字符串大小调整其宽度。但是,对于很长的文本,这可能无法得到理想的结果。
如果您希望能够放置长文本而不是获得很长的标签,可以通过设置MaximumSize来包装文本。
<强> [编辑] 强> 我认为测量可以通过设置自动调整后的宽度(后验)来完成。
另一种方法是尝试使用Graphics.MeasureString来测量文本,here使用实际文本和使用的字体来提供大小。可以找到一个完整的例子(先验)。