2014-01-19 3 views
9

Я узнал, что дочерние элементы управления не выведены за пределы своих родителей. Поэтому, если у меня есть кнопка, которая торчит с правой стороны панели, она нарисована наполовину на той части, где заканчивается панель.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:
Это об элементах управления внутри элементы управления не контролирует внутренние формы .
Нет, нет модного интерфейса. Я знаю, что я могу использовать регионы для создания сумасшедших настольных приложений. Я этого не хочу.

Спасибо!

+1

Мне любопытно: почему вы хотите это сделать? – xxbbcc

ответ

4

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

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

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

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

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

Если вы пытаетесь сделать причудливый интерфейс, где некоторые элементы управления имеют форму капли (не как прямоугольник), либо они кажутся плавающими (отделенными от «основного» пользовательского интерфейса), аналогичными некоторым медиаплеерам и т. Д. : эти программы выполняют всю работу по настройке; их окна все еще являются прямоугольными окнами, но во время рендеринга они используют прозрачные изображения и регионы для визуализации формы.

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

+0

Я просто работаю над элементом управления с очень сложной функциональностью, и мне нужно разделить его на несколько дочерних элементов управления, чтобы облегчить разработку. Считаете ли вы, что было бы хорошо иметь большого родителя для моего «родителя» и его детей, в результате чего появился бы один новый большой родитель и все элементы управления, которые у меня теперь есть как братья и сестры? И нет, чтобы причудливый пользовательский интерфейс ^^ – n4pgamer

+0

@ n4pgamer Извините, я не совсем понимаю, но позвольте мне попытаться ответить. Если у вас есть сложный настраиваемый элемент управления, который вы делаете, тогда да, разделите небольшие куски на другие настраиваемые элементы управления, а затем включите те, которые находятся в основном настраиваемом элементе управления, в качестве дочерних. Если вы добавите более подробную информацию о структуре элемента управления, я попытаюсь добавить больше к ответу. – xxbbcc

0

В WinForms невозможно выйти за пределы контроля.

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

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

enter image description here
Изображение здесь: Getting Started with Windows Forms: Anchor the Buttons to the Bottom Right.

2

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

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

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 позиции элементов управления относительно родителя.

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

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

Смежные вопросы