使控件突破面板边界

问题描述 投票:0回答:1

我正在为WinForms制作一些自定义控件,使自己陷入困境。当调整我的一个控件的大小时,它会比面板边界(高度/宽度)更长,只会被截断。此行为是预期的,但我希望此控件对此有所不同。无论如何,有没有做这项工作而不会打扰那些将这些控件用于控件层次结构的人?Example of what i'm talking about预先感谢。

c# .net winforms controls clipping
1个回答
0
投票

摘自OP的评论之一:

...我在谈论类似ComboBox的东西,即使它位于面板内部,它的下拉菜单也超出了面板的范围...

ComboBox(列表框)的下拉列表显示为顶层窗口(在所有其他窗口之上);因此,它不会作为另一个控件的父级。您可以使用MouseEnter / MouseLeave事件将控件切换为顶级/普通控件,从而执行类似的操作。仅当鼠标输入它并将其更改为顶层窗口时,它才会完全显示。

以下是这种控件的最小实现。

class AutoTopLevelPanel : Panel
{
    private Control parentInternal;
    private int parentIndex = -1;
    private Point locationInternal;

    public AutoTopLevelPanel()
    {
        BorderStyle = BorderStyle.Fixed3D;
    }

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

        if (parentIndex == -1)
        {
            parentIndex = Parent.Controls.IndexOf(this);
        }
        if (base.TopLevelControl != this)
        {
            parentInternal = Parent;
            locationInternal = Location;
            Location = Parent.PointToScreen(Location);
            Parent = null;
            SetTopLevel(true);
        }
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        base.OnMouseLeave(e);
        if (base.TopLevelControl == this)
        {
            SetTopLevel(false);
            Parent = parentInternal;
            Parent.Controls.SetChildIndex(this, parentIndex);
            Location = locationInternal;
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.