c# - 调整文本框的高度
问题描述
我正在开发一个包含多行文本框的用户控件。
使用我的控件时,可以设置要显示的文本。然后 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
属性时自动调整高度)?
解决方案
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);
推荐阅读
- javascript - 如何在 JSX/React 中使用三元运算符渲染多个组件?
- ionic-framework - 离子选择选项 Ionic 4 中的自定义元素
- java - JSON 包含 unicode 字符
- r - ggtitle 中的粘贴功能:删除多余的空格并在 ggplot 标题中添加新行
- javascript - 如何使用 PrimeReact 的 Button 组件?
- angular - RxJS 定时器重启
- javascript - 如何在 jstree 中为 check_node 和 uncheck_node 添加事件侦听器
- python - Pytest - ModuleNotFoundError:没有名为“x”的模块
- ios - 如何在 Swift 4 中按需在多页 UI iOS 应用程序(水平轮播)中生成额外的视图控制器?
- c - Scanf 输入错误