我正在处理包含多行文本框的 UserControl。使用我的控件时,将能够设置将显示的文本。然后 TextBox 应调整其高度以使文本适合,宽度不能更改。所以这里是处理文本的属性:[Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]public string TextToDisplay{ get { return internalTextBox.Text; } set { internalTextBox.Text = value; AdaptTextBoxSize(); }}我的第一次尝试相当简单:private void AdaptTextBoxSize(){ int nbLignes = internalTextBox.Lines.Length; float lineHeight = internalTextBox.Font.GetHeight(); internalTextBox.Height = (int)((nbLignes) * lineHeight);}这不起作用,因为它没有考虑两行文本之间的间距。所以我在文本中的行越多,我被剪掉的就越多。所以我试过这个:private void AdaptTextBoxSize(){ Size textSize = internalTextBox.GetPreferredSize(new Size(internalTextBox.Width, 0)); internalTextBox.Height = textSize.Height;}当文本框中的所有行都短于宽度时,这确实有效。但是当一行较长并且应该剪裁到下一行时,GetPreferredSize()返回的宽度大于我通过的宽度,因此高度太小。所以我再次改变并尝试了这个:private void AdaptTextBoxSize(){ Size textSize = TextRenderer.MeasureText( internalTextBox.Text, internalTextBox.Font, new Size(internalTextBox.Width, 0), TextFormatFlags.WordEllipsis ); internalTextBox.Height = textSize.Height;}这次返回的 Width 是正确的,没有超过我通过的那个,但是高度和之前的试验一样。所以它也不起作用。我为 尝试了不同的组合TextFormatFlags,但无法找到获胜的组合...这是框架的错误吗?这里真正的问题是,有没有我可以尝试的另一件事,或者另一件事来实现我想要的(即在设置TextToDisplay属性时自动调整高度)?
1 回答
慕的地8271018
TA贡献1796条经验 获得超4个赞
TextBox.GetPositionFromCharIndex返回字符的像素位置。此处的位置表示顶部/左侧,因此我们需要再添加一行..
这似乎在这里工作:
textBox.Height = textBox.GetPositionFromCharIndex(textBox4.Text.Length - 1).Y + lineHeight;
我得到这样的行高:
int lineHeight = -1; using (TextBox t = new TextBox() { Font = textBox.Font }) lineHeight = t.Height;
我设置了Height
而不是ClientSize.Height
,这有点错误,除非BorderStyle
是None
。您可以更改为textBox.ClientSize = new Size(textBox.ClientSize.Width, l + lh);
- 1 回答
- 0 关注
- 454 浏览
添加回答
举报
0/150
提交
取消