使控件突破面板边界



我正在为 WinForms 制作一些自定义控件,并遇到了问题。当调整我的一个控件的大小时,它会比面板边界(高度/宽度(长,它只会被切断。此行为是预期的,但我希望此控件有所不同。无论如何,是否可以在不打扰将这些控件与控件层次结构一起使用的人的情况下完成这项工作?我在说什么的例子 提前谢谢。

来自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;
}
}
}

最新更新