在Windows窗体应用程序上停靠和锚定

时间:2009-11-04 11:33:05

标签: c# windows-mobile anchor docking gui-designer

我正在使用 C# .NET Compact Framework 2.0 SP2 Windows Mobile 5.0 及更高版本开发应用。

我有一个WinForm,里面有两个面板(upperPanel和bottomPanel)。我希望upperPanel总是填充表单高度的2/3,而bottomPanel填充表单高度的1/3。两个面板都将填充完整形式的宽度。

我用过这个:

upperPanel.Dock = Fill;
bottomPanel.Dock = Bottom;

但是upperPanel完整填写表格。

我该怎么做?我想要更多或者更少,与不同形式因素以及风景 protrait 模式相同的gui。

谢谢。

8 个答案:

答案 0 :(得分:9)

您需要做的是先将底部面板放在第一位,然后将其Dock属性设置为Bottom。然后将面板的高度设置为窗体高度的1/3。最后,添加第二个面板并将其Dock属性设置为Fill。这里的关键是你要添加控件,它将填充最后添加的剩余区域。或者,您可以使用Visual Studio中的Bring to Front和Send to Back命令来让设计人员进行合作。

您可能还需要为表单挂钩OnSizeChanged事件,并重新设置底部面板的高度以考虑布局更改。自从我进行紧凑的框架编程以来已经有一段时间了,所以我不确定。

答案 1 :(得分:1)

将两个面板设置为“未锚定”。即:删除Dock-Value并清除Anchor属性。然后,移动控件,使它们的大小与您希望它们的大小相同。

之后,在调整表单大小时,它们应该相对调整大小。

修改
哎呀,只是试了一下,确定它不起作用。我把它与一个自动将控件集中在窗口中心的解决方案混合起来......

好吧,我猜你必须为表单的Resize事件创建一个处理程序,并在调整表单大小后手动对齐控件。

答案 2 :(得分:1)

转到“工具”,“其他Windows”,“文档大纲”。找到两个面板,并交换它们的顺序。必须先使用DockStyle.Fill的控件才能正确停靠。 (或者最后......永远不确定它是哪一个,但它是其中之一:p)

这不会解决总是1/3和2/3问题但是......因为底部面板将具有固定高度(除非我弄错了)。我想也许TableLayoutPanel支持这个......

更新:如评论中所述,该面板在紧凑框架中不存在。所以,我想这个问题最简单的解决方案就是尝试使用对接,但只要表单大小发生变化,就会更新底部面板的高度。

答案 3 :(得分:1)

右键单击上面的面板,然后选择“置于前面”。但是,我不认为这会给你想要的结果。调整大小时,底部面板将保持相同的高度,而上面板将拉伸以填充表单。

使用您的停靠设置,使用此代码可能会解决问题:

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);

        this.bottomPanel.Height = Convert.ToInt32((double)this.Height / 3.0);
    }

答案 4 :(得分:0)

如果你想让它完美地工作,你需要在Form的Resize事件中添加一些代码,然后专门计算相对大小,并在调整大小后将控件放在正确的位置。

如果你不担心失去精确度并且表格不会移动很多,你可以通过使用一些相对聪明的锚点来避免这种情况。基本上你将不得不选择一个“种植者”(形式的一部分越大,形式越大)。在这种情况下,我可能会将顶部锚定到Top |左|右上角和上半部分左|对|底部。这意味着如果表单扩展,表单的下半部分将变大。大多数情况下这是可以接受的。如果不使用Resize事件和一些代码。

答案 5 :(得分:0)

最简单的方法是嵌套面板。只需设置顶部面板和填充面板。然后使用这些面板中的面板来做同样的事情。我在其中遇到的唯一问题是数据网格调整大小,无论如何总是很痛苦。在这种情况下,您必须使用一些代码来调整表单resize事件上的datagrid控件。

答案 6 :(得分:0)

我想补充一点@jasonh的答案。

对于占据表单2/3的面板,您必须将面板的AutoScroll属性设置为true。

这将使面板在控件尺寸超出用户可见度时显示滚动,并确保较小面板的可见性,即窗体高度的1/3。

答案 7 :(得分:0)

您可以使用嵌套面板以及使用“锚定”和“停靠属性”设置的少量设置来获取所需的设计。请执行以下步骤: 1)添加表格并在其上放置Panel1。将其Dock属性设置为'填充'并且ResizeMode为' Grow& Shrink' 2)添加第二个panel2并将其Dock属性设置为' Bottom',设置高度并将Anchor属性设置为' Top,Left'。 3)添加第三个面板并将其Dock属性设置为' None',设置高度并将Anchor属性设置为“Top”,“Bottom”,“Left”,“Right”和“#39”。

保存并编译。现在所有的面板都会通过调整大小来保持相对的定位。