.NET Compact Framework中的Label / TextBox的AutoSize

时间:2009-04-20 08:08:28

标签: c# .net compact-framework

对于.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所需的范围太大了。如果它足够大,可以在最极端的情况下实际工作(段落主要由很长的单词组成),大多数盒子最终会成为一条或两条太高的线条。

我可能不得不自己实施自动换行,但在我去那里之前,有没有人为此准备好一个干净的解决方案呢?

我将永远感激不尽!

2 个答案:

答案 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  ")
  }
}