Winforms中可调整大小的文本框

时间:2015-08-06 02:43:42

标签: c# winforms textbox resize

我想知道如何让用户在运行时自己调整文本框的大小。优选地,文本框边框上的小标签会弹出,并且可以拖动以根据大多数应用调整大小。

是否可以使用winforms本地执行此操作?如果没有,有一个图书馆可以帮忙吗?

如果可能,我宁愿使用原生组件。我所有的谷歌搜索都会出现误报。

2 个答案:

答案 0 :(得分:5)

使用本机组件的最简单解决方案是使用textbox并添加MouseEvents来实现您自己的自定义控件。这是一个示例,可让您在垂直方向上拖动TextBox的底部区域。当然,如果你想制作一个pop-up,你应该实现一些更像是更改光标手柄和重新绘制某些区域的东西。

这是一个有效的概念:

bool isDrag = false;
int lastY = 0;
private void textBox1_MouseEnter(object sender, EventArgs e)
{
    //Change cursor to dragging handle or implement a pop-up
}

private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
    //Just add 5px padding
    if (e.Y >= (textBox1.ClientRectangle.Bottom - 5) &&
        e.Y <= (textBox1.ClientRectangle.Bottom + 5))
    {
        isDrag = true;
        lastY = e.Y;
    }
}

private void textBox1_MouseMove(object sender, MouseEventArgs e)
{
    if( isDrag)
    {
        textBox1.Height += (e.Y - lastY);
        lastY = e.Y;
    }
}

private void textBox1_MouseUp(object sender, MouseEventArgs e)
{
    if (isDrag)
    {
        isDrag = false;
    }
}

要尝试代码,请在新表单上创建名为TextBox的{​​{1}}并连接所有textBox1。尝试将鼠标放在MouseEvents的底部,然后向上或向下拖动。

不要忘记将 TextBox 设置为 TextBox.Multiline

答案 1 :(得分:1)

更好的方法是使用AnchorDock属性来根据父控件扩展控件。阅读Manage WinForm controls using the Anchor and Dock properties

根据您的要求,其他选项为TableLayoutPanelFlowLayoutPanel

<强> TableLayoutPanel中

  

TableLayoutPanel控件将其内容排列在网格中。因为   布局在设计时和运行时都可以执行   随着应用程序环境的变化动态变化。这给了   面板中的控件按比例调整大小的能力,所以它   可以响应父控件调整大小或文本等更改   由于本地化导致长度变化。

     

任何Windows窗体控件都可以是TableLayoutPanel的子窗口   控件,包括TableLayoutPanel的其他实例。这允许   你要构建适应变化的复杂布局   运行时。

<强> FlowLayoutPanel的

  

FlowLayoutPanel控件将其内容排列在水平或   垂直流动方向。它的内容可以从一行包装到   下一个,或从一列到下一列。或者,它的内容   可以剪裁而不是包裹。

     

您可以通过设置值来指定流向   FlowDirection属性。 FlowLayoutPanel控件正确反转   它的流向从右到左(RTL)布局。你也可以   指定FlowLayoutPanel控件的内容是否为   通过设置WrapContents属性的值来包装或剪裁。