使用自定义LayoutEngine进行Winforms控制

时间:2017-02-09 14:37:23

标签: c# winforms controls

在C#WinForms中,如果控件停靠,则永远不会使用边距。在大多数情况下,诀窍是将控件放在带有一些填充的面板中。现在我正在寻找没有容器面板的解决方案,因为我的控件已经是面板的后代。因此,对于用户而言,我会将大多数属性从容器面板路由到内部面板,这会让人感到困惑。

我的第一次尝试是自定义LayoutEngine,但该主题并不多。但它有点工作。但我对周围(兄弟控制)的一些问题,他们重叠我控制“更大”(边缘)的部分。在我的自定义layoutengine是使控件尺寸更大(添加边距)并相应地移动x / y

Image Custom Panel

绿色控件是我的自定义面板,底部停靠,边距为10,红色控件是一个普通面板,底部也停靠。

现在我可以调整兄弟控件的大小,但我认为这会产生更多问题?有没有办法告诉其他(兄弟)控件我的控件的大小已经改变,他们应该更新他们的布局?

public class CustomLayoutEngine : LayoutEngine
{
    public override bool Layout(object container, LayoutEventArgs layoutEventArgs)
    {
        bool result = base.Layout(container, layoutEventArgs);

        Control parent = container as Control;

        if (parent.Dock == DockStyle.Bottom && (parent.Margin.Left > 0 || parent.Margin.Right > 0))
        {
            Int32 newWidth = parent.Size.Width - (parent.Margin.Left + parent.Margin.Right);
            Int32 newHeight = parent.Size.Height - (parent.Margin.Bottom);

            parent.Size = new Size(newWidth, parent.Size.Height);
            parent.Location = new Point(parent.Location.X + parent.Margin.Left, parent.Location.Y - parent.Margin.Bottom);
        }           

        return result;
    }
}

0 个答案:

没有答案