2010-04-05 9 views
9

Bir UserControl yazıyorum. Yeniden boyutlandırma yapılırken kullanıcı kontrolünü çizmek istiyorum. Windows formunun "ResizeEnd" öğesine eşdeğer bir olayı bulamıyorum."ResizeEnd" kullanıcı denetimleri için eşdeğer

Kullanıcı denetimleri için herhangi bir eşdeğer olay var mı?

Bu durumda, kullanıcı denetiminin üst denetiminin kendisi bir UserControl olduğunu, bu yüzden (ana kullanıcı denetimi) bir forma dönüştüremediğimi unutmayın. Bir çerçeve kullandığım için, bu kullanıcı denetiminin görüntüleneceği forma erişemiyorum.

+0

Sorununuzu çözdünüz mü? Cevabınız evet ise nasıl? Aynı sıkıntılarım var ve olası bir çözümü yayınladım [burada] (http://stackoverflow.com/questions/7584307/user-control-resize) – Marco

cevap

7

Eşdeğer yoktur. Bir form, kullanıcı kenarı veya formun bir köşesini tıkladığında başlatılan bir modal boyutlandırma döngüsüne sahiptir. Çocuk kontrolleri bu şekilde yeniden boyutlandırılamaz, sadece Boyut özelliğinde değişiklikler görür.

Kullanıcı denetiminize Sizing özelliği ekleyerek bunu çözün. Form, OnResizeBegin/End() geçersiz kılmalarından kolayca atayabilir. Form bulana kadar UC Load olayı ana özellik ardından çok mümkündür:

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; 
    } 
} 
+0

Belki de ana form bir kullanıcı kontrolüdür. Bu yüzden, üst denetimi bir forma dönüştüremiyorum. – Ram

+0

@Ram: bu yüzden while döngüsü var. Onu denedin mi? –

+0

@Hans Passant: Bu gönderi yazımdan sonra bana verildi [burada] (http://stackoverflow.com/questions/7584307/user-control-resize). Sorun, (cevabınızı kullanarak) ebeveyn döngü sırasında null olur ve her şey başarısız olur. This.FindForm() işlevini kullanmak bile bana boş verir. Başka bir fikrin var mı? – Marco

1

Hans çözüm çalışıyor (ve bunu yapmanın tek yolu gibi görünüyor), ama bu bu işleyicileri gerektirir Her formda, kontrolünüzü kullanarak (her zaman kabul edilemez).

Böylece, yeniden boyutlandırılırken zamanlayıcıyı başlatmayı basit geçici çözüm kullanabilirsiniz. Her zaman boyutu değiştirildikten sonra zamanlayıcınız yeniden başlatılacak. Ve sadece bir süre için herhangi bir boyut değişikliği olmayacaksa (_timer.Interval) ResizeFinished() yöntemini çağırır.

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 
    } 

Gördüğünüz gibi

, kodunuz son boyutu değiştirilen çağırma sonra sonra 500 ms çağrılır.