Сделать контроль над границами панели - PullRequest
0 голосов
/ 09 октября 2019

Я делал несколько пользовательских элементов управления для WinForms и столкнулся с проблемой. При изменении размера одного из моих элементов управления таким образом, чтобы он становился длиннее границ панели (высота / ширина), он просто обрезался. Такое поведение ожидается, но я хотел, чтобы оно было другим для этого элемента управления. Есть ли способ заставить это работать, не мешая человеку, который будет использовать эти элементы управления с иерархией элементов управления? Пример того, о чем я говорю Заранее спасибо.

1 Ответ

0 голосов
/ 10 октября 2019

Из одного из комментариев ОП:

... Я говорил о чем-то похожем на ComboBox, когда хотя оно находится внутри панели, его выпадающий список выходит за границы панели .. .

Раскрывающийся список ComboBox (ListBox) отображается как окно верхнего уровня (над всеми остальными);как таковой он не связан с другим контролем. Вы можете сделать что-то подобное, используя события 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;
        }
    }

}
...