Элементы управления C# за пределами родительских границ?

Я обнаружил, что дочерние элементы управления не выводятся за пределы родительских границ. Поэтому, если у меня есть кнопка, которая торчит из правой стороны панелей, она нарисована на полпути к той части, где заканчивается панель.

2 вопроса:

  • здесь любой способ иметь дочерние элементы управления за пределами границ родителей (с некоторым трюком, возможно) ?
  • в чем причина такого ограничения ? (Я хочу понять что)


пример С 2 кнопками: b1-большой родитель, b2-меньший ребенок:
public Form1()
{
    Size = new Size(800, 600);

    Button b1 = new Button();
    b1.Text = "hello world";
    b1.SetBounds(0,0,256,128);
    Controls.Add(b1);

    Button b2 = new Button();
    b2.Text = "abcdefghijklmnopqrstuvwxyz";
    b2.SetBounds(192,32,128,64);
    b1.Controls.Add(b2);
}

Edit:
Речь идет о контроле внутри controls не контролирует внутри форм.
Нет, никакого причудливого интерфейса. Я знаю, что могу использовать регионы для создания сумасшедших настольных приложений. Это не то, чего я хочу.

спасибо!

3 ответов


на Form - Это также элемент управления, поэтому он ведет себя очень похоже на другие элементы управления.

ограничение отрисовки происходит из - за того, что элементы управления являются окнами в операционной системе, которые просто представляют прямоугольную область дисплея. Окно не может рисовать что-либо за пределами своих границ, поэтому, если дочерний элемент управления помещен за эти границы, он не будет отображаться (или только частично, в зависимости от его положения).

нет простого способа обойти это и вся концепция дочерних элементов управления вращается вокруг родителя, контролирующего то, что рисуется. Если вы хотите нарисовать дочерний элемент управления за пределами его родителя, удалите "дочерний" из родителя, так как отношение на самом деле не применяется.

вы можете придумать какой-то пользовательский код рендеринга, который будет работать вокруг этого, но тогда элементы управления не будут истинными дочерними элементами других контейнеров, и вам придется написать достаточное количество кода рендеринга, чтобы заставить его работать. Может быть некоторые ситуации, когда это было бы желаемым поведением, но в большинстве случаев поведение системы по умолчанию лучше (и означает меньше работы для программиста).

вы можете получить визуальный эффект кнопки, находящейся "вне" формы, путем пользовательского рендеринга формы (то есть рисования ее меньше, чем на самом деле), а затем рендеринга кнопки в пустом пространстве. Это, однако, много работы, и я не уверен, что вы захотите пойти этим путем.

Если вы пытаетесь сделать необычные UI где некоторые элементы управления имеют форму blob (не прямоугольника) или плавают (отделены от "основного" пользовательского интерфейса), подобно некоторым медиаплеерам и т. д.: эти программы выполняют весь пользовательский рендеринг; их окна по-прежнему прямоугольные окна, но во время рендеринга они используют прозрачные изображения и области для рендеринга формы.

это поможет, если вы добавите более подробную информацию к вашему вопросу о том, почему вы хотите это сделать.


вы не можете рисовать вне границ элементов управления/родителей. Однако вы можете поместить контроль в одного из предков родителей.

Это код, который я использую для создания выпадающего меню, когда этот пользовательский элемент управления переключается:

private void Me_ToggledChanged(System.Object sender, System.EventArgs e)
{

    if (this.Parent != null) {


        Control topParent = this;
        int x = 0;
        int y = 0;

        while (topParent.Parent != null) {
            x += topParent.Left;
            y += topParent.Top;
            topParent = topParent.Parent;
        }

        if (this.Toggled) {
            if (!topParent.Controls.Contains(dropDownMenu)) {
                topParent.Controls.Add(dropDownMenu);
            }

            dropDownMenu.Location = new Point(x, y);        
            dropDownMenu.Visible = true;
            dropDownMenu.BringToFront();
        } else {
            if (topParent.Controls.Contains(dropDownMenu)) {
                this.Parent.Controls.Remove(dropDownMenu);
            }
            dropDownMenu.Visible = false;
        }

    }
}

dropDownMenu-это элемент управления, который устанавливается в другом месте конструктора этого элемента управления.

Я начинаю с получения самого верхнего родителя, поскольку я проверяю каждого родителя, я также получаю запущенное значение x и y позиции элементов управления относительно родителя.

если этот элемент управления переключается, я добавляю его в самый верхний родитель и устанавливаю его положение, иначе я удаляю его.

Я уверен, что есть более сложные способы, и это может не работать во всех обстоятельствах, однако это решение идеально подходит для меня, пишущего кнопку меню .NET CF.


в WinForms невозможно рисовать за пределами границ элемента управления.

самый простой способ ограничить кнопку внутри панели-использовать Anchor свойство соответствующим образом. Обычно кнопки выровнены справа. Если вы хотите сохранить это выравнивание при изменении размера панели, закрепите кнопку справа. Если кнопка находится внизу, закрепите ее на дне, а в противном случае на вершине.

Если вы хотите, чтобы кнопка изменяла размер с шириной панели, то закрепить его слева и справа одновременно, а также сверху или снизу.

enter image description here
фото здесь: начало работы с Windows Forms: закрепите кнопки в правом нижнем углу.