Эквивалент ResizeEnd для пользовательских элементов управления - PullRequest
9 голосов
/ 05 апреля 2010

Я пишу UserControl. Я хочу нарисовать пользовательский элемент управления, когда изменение размера будет сделано. Я не могу найти какое-либо событие, эквивалентное ResizeEnd формы окна.

Существует ли какое-либо эквивалентное событие для пользовательских элементов управления?

Обратите внимание, что в этом случае родительский элемент управления пользовательского элемента управления сам по себе является UserControl, поэтому я не могу преобразовать его (родительский элемент управления) в форму. Поскольку я использую среду, я не могу получить доступ к форме, в которой будет отображаться этот пользовательский элемент управления.

Ответы [ 2 ]

7 голосов
/ 05 апреля 2010

Нет эквивалента.Форма имеет модальный цикл изменения размера, запускаемый, когда пользователь щелкает край или угол формы.Размер дочерних элементов управления не может быть изменен таким образом, он видит только изменения в свойстве Size.

Решите это, добавив свойство Sizing в свой пользовательский элемент управления.Форма может легко назначить ее из переопределений OnResizeBegin / End ().Следуйте за свойством Parent в событии Load UC, пока не обнаружите, что Форма тоже возможна:

public bool Resizing { get; set; }

private void UserControl1_Load(object sender, EventArgs e) {
  if (!this.DesignMode) {
    var parent = this.Parent;
    while (!(parent is Form)) parent = parent.Parent;
    var form = parent as Form;
    form.ResizeBegin += (s, ea) => this.Resizing = true;
    form.ResizeEnd += (s, ea) => this.Resizing = false;
  }
}
1 голос
/ 10 января 2014

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

Таким образом, вы можете использовать простой обходной путь, запускающий таймер при изменении размера. Каждый раз, когда размер будет изменен, ваш таймер будет перезапущен. И только когда в течение некоторого времени не будет изменений размера (_timer.Interval), он вызовет метод ResizeFinished ().

    private Timer _timer;

    public MyControl() 
    {
        _timer = new Timer();
        _timer.Interval = 500;
        _timer.Tick += (sender, e) => ResizeFinished();
    }

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);
        _timer.Start();
    }

    private void ResizeFinished()
    {
        _timer.Stop();
        // Your code
    }

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

...