【问题标题】:Make a control break out of panel bounds使控件突破面板边界
【发布时间】:2020-02-06 08:31:14
【问题描述】:

我在为 WinForms 制作一些自定义控件时遇到了问题。当调整我的一个控件的大小时,它会变得比面板边界(高度/宽度)更长,它会被切断。这种行为是意料之中的,但我希望它对这个控件有所不同。有没有办法在不打扰将这些控件与控制层次结构一起使用的人的情况下完成这项工作? Example of what i'm talking about 提前致谢。

【问题讨论】:

  • 这种行为是正常的。面板将显示剪辑到其边界。要显示整个内部控件,您必须将其设置为外部,即更改其父级。如果你想让一个控件凌驾于另一个控件之上,你必须改变 z 顺序。
  • @OlivierRogier 此更改必须由将使用自定义控件的用户进行 - 这不是我的意图。我说的是ComboBox 之类的东西,即使它在面板内,它的下拉菜单也会超出面板的范围;这就是我想要完成的。
  • 我不明白。如果我在面板底部放置了一个包含某些项目的组合框,列表不会夹在面板的边框上......您能否通过更多详细信息、代码和表单/控件的真实图像来改进您的问题?
  • 这就是我想要做的,使自定义控件不剪辑,就像 ComboBox 不一样。编辑:Video of my custom control X ComboBox
  • 你的自定义控件容器的父类是什么?组合框在哪里:在它内部还是在自定义控件内部的控件内部?

标签: c# .net winforms controls clipping


【解决方案1】:

来自 OP 的一个 cmets:

...我说的是 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;
        }
    }

}

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2011-02-19
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多