Control.Parent = null - PullRequest
       1

Control.Parent = null

2 голосов
/ 16 июля 2010

У меня есть собственный элемент управления, полученный из Windows.Forms.Control, и я проверяю Parent.BackColor внутри переопределенного метода OnHandleCreated (). В desing-time свойство Parent сначала возвращает null, затем - после полной загрузки формы - возвращает реальное родительское окно: сама форма.

Нам нужно нарисовать часть пользовательского элемента управления тем же цветом фона родительской формы: когда мы можем положиться на значение Control.Parent?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 16 июля 2010

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

0 голосов
/ 16 июля 2010

На самом деле я не вижу здесь проблемы. Потому что, насколько я понимаю, вам нужен родитель для рисования чего-либо с цветом спины родителя, и когда вы получаете событие Paint своего элемента управления (OnPaint, WM_PAINT), родительский объект уже инициализирован.

0 голосов
/ 16 июля 2010

Вот цитата из книги Криса Селлса Программирование Windows Forms на C # (стр. 259):

Свойство ambient - это свойство, которое, если оно не установлено в элементе управления, будет «унаследовано» от контейнера. Из всех стандартных свойств, предоставляемых базовым классом Control, только четыре являются внешними: BackColor, ForeColor, Font и Cursor. [...] (Акцент добавлен мной.)

Может быть, это поможет избежать зависимости от свойства Control.Parent ...?


PS: На самом деле, некоторые из других ответов, вероятно, более полезны, чем мой: я начинаю думать, что, возможно, метод OnHandleCreated - просто неправильное место для запроса свойства родителя элемента управления. , OnParentChanged или даже OnPaint, вероятно, лучшие места для этого.

0 голосов
/ 16 июля 2010

вы можете использовать if( this.DesignMode ) return;, чтобы определить, находится ли ваш элемент управления в разработке и не получить исключение, или выполнить дополнительную проверку. В Windows Forms после InitilizeComponents у элемента управления afaik всегда есть родительский элемент.

...