Как вызвать событие Control.Resize без фактического изменения размера?

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


person mafu    schedule 05.02.2009    source источник
comment
если вы не изменяете размер элемента управления, то зачем вам изменять размер!?   -  person Calanus    schedule 05.02.2009
comment
Если вы хотите перерисовать элемент управления, выполните Control.Invalidate()   -  person Calanus    schedule 05.02.2009
comment
У меня есть наблюдатель, ожидающий изменения размера. Изменение наблюдателя на ожидание перерисовки было бы неуместным, поскольку он просто изменяет размер внутреннего элемента управления.   -  person mafu    schedule 05.02.2009


Ответы (4)


Если вы создаете подкласс Control, вы можете вызвать OnResize напрямую или предоставить его через API:

 public void OnResize() {
     this.OnResize(EventArgs.Empty);
 }

Однако вы не можете сделать это для произвольных элементов управления. Вы могли бы поменять Size туда-сюда? В качестве альтернативы вы можете использовать отражение, но это хаки:

 typeof (Control).GetMethod("OnResize",
     BindingFlags.Instance | BindingFlags.NonPublic)
     .Invoke(myControl, new object[] {EventArgs.Empty});
person Marc Gravell    schedule 05.02.2009
comment
Рефлексия была бы возможна, но это, вероятно, излишество, а также кажется очень уродливым. - person mafu; 05.02.2009

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

control_Resize(null, null);
person John Line    schedule 18.12.2015

Почему вы хотите это сделать и в каком сценарии? Вы можете вызвать OnResize, например, когда вы находитесь в самом элементе управления (т.е. в вашем производном классе элемента управления). (Или через Reflection, когда вы снаружи.)

Кроме того, вам, вероятно, придется изменить размер элемента управления, поскольку для этого предназначено событие Resize :)

person Fabian Schmied    schedule 05.02.2009

Просто измените размер элемента управления, используя: Control.Size = new Size(x,y);

Изменение размера элемента управления вызовет событие изменения размера для этого элемента управления, и размер элемента управления должен измениться.

В качестве альтернативы, если вы просто хотите перерисовать элемент управления, выполните: Control.Invalidate();

person Calanus    schedule 05.02.2009
comment
Это неправильно. Установка нового размера не вызывает событие изменения размера для этого элемента управления. - person user3147973; 23.04.2020