对于.NET Compact Framework中的Label和TextBox控件省略了AutoSize属性,我完全疯了。我有一个简单的应用程序,它应该在TabControl中列出一堆文本数据(通常在一行到几段文本之间)。其他一切工作顺利,但我动态调整用于显示文本的Label / TextBox控件的尝试都失败了。
这是我尝试过的方式:
/*
Variables:
s = The text intended for the TextBox
NewTB = TextBox object
width = Intended width
whiteSpaceAdjustment = amount of pixels per line to adjust "wasted" whitespace due to wrapping
*/
String[] linesArray = s.Replace(Environment.NewLine, "\n").Split(new char[] { '\n' });
int lines = 0;
int lineHeight = g.MeasureString(
s.Replace("\n", "").Replace("\r", ""),
LabelFont
).ToSize().Height;
foreach (String str in linesArray) {
if (str.Length == 0) {
lines++;
continue;
}
szz = g.MeasureString(str, LabelFont).ToSize();
lines += szz.Width / (width - whiteSpaceAdjustment);
lines += (szz.Width % width) != 0 ? 1 : 0;
}
NewTB.Height = lines * lineHeight;
NewTB.Width = width;
...但问题是whiteSpaceAdjustment所需的范围太大了。如果它足够大,可以在最极端的情况下实际工作(段落主要由很长的单词组成),大多数盒子最终会成为一条或两条太高的线条。
我可能不得不自己实施自动换行,但在我去那里之前,有没有人为此准备好一个干净的解决方案呢?
我将永远感激不尽!
答案 0 :(得分:3)
试试这篇文章
www.mobilepractices.com/2007/12/multi-line-graphicsmeasurestring.html
请务必查看文章底部的链接,以便能够使用不同的字体。
如果您使用的是.Net CF 3.5,您可以将其示例转换为扩展方法。否则我建议您创建一个继承自框架控件的新控件。
答案 1 :(得分:1)
这是我为WinCE中标签的自动重新调整宽度而开发的。
class DrawImageHolder: NSView {
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
Swift.print(" drawRect is executed ")
}
}