我正在写一个UserControl。我想在调整大小时绘制用户控件。我无法找到任何与Windows窗体的“ResizeEnd”等效的事件。
是否有用户控件的等效事件?
请注意,在这种情况下,用户控件的父控件本身就是UserControl,因此我无法将其(父用户控件)转换为表单。当我使用框架时,我无法访问将显示此用户控件的表单。
答案 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毫秒后才会调用您的代码。