父母界限之外的C#控制?

时间:2014-01-19 18:47:30

标签: c# winforms controls

我发现子控件不是在父级界限之外绘制的。因此,如果我有一个从面板右侧伸出的按钮,它会被拉到面板结束部分的一半。

2个问题:

  • 是否有任何方式在父母范围之外设置子控件(可能有一些技巧)?
  • 这种限制的原因是什么? (我想明白这一点)

<小时/> 带有2个按钮的示例:b1是较大的父级,b2是较小的子级:

public Form1()
{
    Size = new Size(800, 600);

    Button b1 = new Button();
    b1.Text = "hello world";
    b1.SetBounds(0,0,256,128);
    Controls.Add(b1);

    Button b2 = new Button();
    b2.Text = "abcdefghijklmnopqrstuvwxyz";
    b2.SetBounds(192,32,128,64);
    b1.Controls.Add(b2);
}

修改
它是关于控件内部的控件不是控件内部的形式 不,没有花哨的用户界面。我知道我可以使用区域来创建疯狂的桌面应用程序。那不是我想要的。

谢谢!

3 个答案:

答案 0 :(得分:4)

Form也是一个控件,所以它的行为与其他控件非常相似。

渲染限制来自于控件是操作系统中的窗口,其仅表示显示器的矩形区域。窗口不能在其自己的边界之外绘制任何东西,因此如果子控件放在这些边界之外,它将不会被渲染(或者只是部分渲染,具体取决于它的位置)。

没有简单的方法可以解决这个问题,并且子控件的整个概念围绕着控制绘制内容的父控件。如果要在父项的边界之外绘制子控件,请从父项中删除“子”,因为该关系并不真正适用。

你可以想出一些可以解决这个问题的自定义渲染代码,但是控件不会是其他容器的真正子代,你必须编写相当数量的渲染代码才能使它工作。在某些情况下,这可能是期望的行为,但在大多数情况下,默认的系统行为更好(并且意味着程序员的工作量更少)。

通过自定义渲染表单(即,将其绘制得比实际更小),然后在空白区域中渲染按钮,可以获得窗体“外部”的按钮的视觉效果。然而,这是很多工作,我不确定你是否想采取这种方式。

如果你试图做一个花哨的UI,其中一些控件形状像blob(不像矩形)或它们看起来漂浮(与“主”UI分离),类似于一些媒体播放器等:那些程序完成整个自定义渲染的事情;他们的窗户仍然是矩形窗户,但在渲染过程中,他们使用透明图像和区域来渲染表格。

如果您在问题中添加了更多详细信息,为什么要这样做,这会有所帮助。

答案 1 :(得分:2)

你无法在控件/父母界限之外绘制。但是,您可以将控件放在父母之一的祖先中。

这是我在切换此自定义控件时用于创建下拉菜单的一些代码:

private void Me_ToggledChanged(System.Object sender, System.EventArgs e)
{

    if (this.Parent != null) {


        Control topParent = this;
        int x = 0;
        int y = 0;

        while (topParent.Parent != null) {
            x += topParent.Left;
            y += topParent.Top;
            topParent = topParent.Parent;
        }

        if (this.Toggled) {
            if (!topParent.Controls.Contains(dropDownMenu)) {
                topParent.Controls.Add(dropDownMenu);
            }

            dropDownMenu.Location = new Point(x, y);        
            dropDownMenu.Visible = true;
            dropDownMenu.BringToFront();
        } else {
            if (topParent.Controls.Contains(dropDownMenu)) {
                this.Parent.Controls.Remove(dropDownMenu);
            }
            dropDownMenu.Visible = false;
        }

    }
}

dropDownMenu是在此控件的构造函数中的其他位置设置的控件。

我首先获得最顶级的父级,因为我检查每个父级,我还得到控制位置相对于父级的运行x和y值。

如果切换此控件,则将其添加到最顶层的父级并设置其位置,否则我将其删除。

我确信有更复杂的方法,这可能不适用于所有情况,但是这个解决方案对我来说非常适合编写.NET CF菜单按钮。

答案 2 :(得分:0)

在WinForms中,无法在控件的边界之外绘制。

将按钮限制在面板内部的最简单方法是适当使用Anchor属性。通常按钮是右对齐的。如果要在面板调整大小时保持此对齐方式,请将按钮停靠在右侧。如果按钮位于底部,则将其固定在底部,否则将其固定在顶部。

如果您希望按钮使用面板宽度调整大小,则将其同时停靠在左侧和右侧以及顶部或底部。

enter image description here
图片位于此处:Getting Started with Windows Forms: Anchor the Buttons to the Bottom Right