“ResizeEnd”等效于usercontrols

时间:2010-04-05 10:33:44

标签: .net winforms resize

我正在写一个UserControl。我想在调整大小时绘制用户控件。我无法找到任何与Windows窗体的“ResizeEnd”等效的事件。

是否有用户控件的等效事件?

请注意,在这种情况下,用户控件的父控件本身就是UserControl,因此我无法将其(父用户控件)转换为表单。当我使用框架时,我无法访问将显示此用户控件的表单。

2 个答案:

答案 0 :(得分:7)

没有等价物。表单具有模态大小调整循环,在用户单击表单的边缘或角落时启动。子控件无法以这种方式调整大小,只能看到其Size属性的更改。

通过向用户控件添加Sizing属性来解决此问题。表单可以轻松地从其OnResizeBegin / End()覆盖中分配它。在UC的Load事件中的Parent属性之后,直到您找到Form也是可能的:

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 :(得分:1)

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毫秒后才会调用您的代码。