2009-04-15 33 views
6

Yeniden boyutlandırmak için bir Windows Formunda bir UserControl (üzerinde bir ızgara vardır) almaya çalışıyorum. Aşağıdaki kod, formda sahip olduğum koddur. Benim aldığım davranış kontrolün büyük olduğu zaman yeniden boyutlandırılmasıdır. Ama küçülmez. Neyi yanlış yapıyorum (veya) Neyi özlüyorum? İfade değiştirilemiyor, çünkü bu bir değişken değil

//Resize the grid that the UserControl has on it 
private void NameValuePropertyBag_Resize(object sender, EventArgs e) 
{ 
    grdNameValueProperties.Location = new Point(4,4); 
    grdNameValueProperties.Size = new Size(this.Width - 8, this.Height - 8); 
} 

Ben

grdNameValueProperties.Size.Width = this.Width - 8; 
grdNameValueProperties.Size.Height = this.Height -8; 

Bu hata bana "bu bir değişken olmadığı için ifade değiştirilemiyor" verir çalıştı:

private void AdjustGrid() 
{ 
    ZoomControl.Location = new Point(5, 5); 
    ZoomControl.Size = new Size(this.Width - 15, this.Height - 75); 
} 

void zoomform_Resize(object sender, EventArgs e) 
{ 
    AdjustGrid(); 
} 

Şimdi kullanıcı kontrolü aşağıdaki kodu vardır. .. Neyi kaçırıyorum?

Ek Bilgi: Başka Form (ZoomForm) bir UserControl Büyütmek/taşımak için

Ben SetParent kullanıyorum(), Windows çağrı. Anchor, SetParent() ile taşınan denetimler için işe yaramıyor gibi görünüyor ... Daha açıkçası, çalışıyor olabilir, ancak ben yeniden boyama sorunları var.

ben rötuş sorunları olmadan çalışmaya Çapa/dock çift var [I boyutlandırma olay wireup kaldırıldı ve Dolgu Yuvası ayarlanmış] ZoomForm Unsettling hiçbir denetimleri vardır

. Usercontrol, ParentForm'a dinamik olarak eklenir.

Şu anda görüntüyü büyütmek için yukarıdaki kod ile ancak daha küçük olmamalıdır. Size tesiste değer türü olduğundan

+0

Neden sadece yeniden boyutlandırmak için çapa özelliklerini yerine kod kullanmıyorsun? – recursive

+0

@recursive: Bir UserControl öğesini başka bir forma (ZoomForm) taşımak/uzaklaştırmak için SetParent() Windows çağrısı kullanıyorum. Anchor SetParent() ile taşınan kontroller için işe yaramaz ... Daha doğrusu, belki çalışıyor olabilir ama ben yeniden boyama sorunları var –

cevap

1

doğrudan böylece genişliği esasen tüm Size özelliği üzerine yazarak olacağını değişen bir UserControl Size.Width özelliğini değiştiremez. Bunun yerine, WinForms kontrolleri kendi Genişlik ve Yükseklik özelliklerini sağlarlar, bu nedenle bu kod çalışması gerekir:

grdNameValueProperties.Width = this.Width - 8; 
grdNameValueProperties.Height = this.Height - 8; 

ben muhtemelen sadece "bunu yapmak için UserControl'ın Anchor özelliğini kullanması gerektiğini @ özyinelemeli yorumuna katılıyorum, söyledikten otomatik olarak yeniden boyutlandır.

+0

@Matt: Teşekkürler ... Ben yeni Size() atamaları kurtulmak. Ben hala aynı sorunu yaşıyorum: Forma daha büyük ama daha küçük yapamam :( –

+0

Hangi Resize olayını yakalıyorsunuz? UserControl'ün üzerinde bulunduğu bir denetimdeki olay yerine? Bunun yerine formun Resize olayını yakalayabilir misiniz? –

7
grdNameValueProperties.Size.Width = this.Width - 8; 
grdNameValueProperties.Size.Height = this.Height -8; 

Bu kod hata verir çünkü Boyut, bir referans türü değil, bir değer türüdür. Bu http://www.yoda.arachsys.com/csharp/parameters.html'u okumak, değer türleri ile başvuru türleri arasındaki farkı açıklamaya yardımcı olabilir.

4

Yinelemeli olarak yorumlandığında, yalnızca Anchor özelliğini kullanmalısınız.

Boyut özelliği, bir referans türünü değil, bir yapı oluşturduğundan dolayı hata oluşuyor. Boyut özelliği, denetimin boyut nesnesinin bir kopyasını döndürür. Özelliklerin yazılması Bu kopyanın Genişlik ve Yüksekliği bir anlam ifade etmemektedir, çünkü bu sadece geçici bir kopyadır ve herhangi bir yerde bellek tarafından desteklenmez. İlk kısım için

+0

@danbruc: SOOO aptallığım ilk kez değil. Tazeleyici için zaten teşekkürler :) –

0

-

Öncelikle, ben UserControl Çapa özelliğini kullanarak yerine büyüklüğüne bu kendini çalışırken öneriyoruz.Pencereyi yeniden boyutlandırmak için çok basit ve çok güvenilir bir şekilde çalışır. Bunu yapmak istiyorsanız

, muhtemelen yerine this.Height ve this.Width ait this.ClientSize kapalı zincirleme bakmak gerekir. Muhtemelen kontrolünüzü çok büyük bir düzeye getiriyorsunuz ve bu da paneli veya oturduğunuz diğer şeyleri bozuyor. Bu da her türlü soruna neden oluyor.

ikinci parça gridNameValue Properties.Size.Width bir yapı bir üyesi olduğu gerçeğinden kaynaklanmaktadır.

Eğer gridNameValueProperties.Size diyoruz

, daha sonra döndürülen yapı (orijinal değil) üzerinde Genişlik ayarlamaya çalışırken, bir Boyut yapı getiriyorduk. Bu nedenle, tüm Boyut valuetype'ini tek bir çekimde ayarlamanız gerekir. Yeni bir Boyut() oluşturmak ve bunu gridNameValueProperties.Size olarak ayarlamak, bu işi yapmanın tek yoludur.

+0

@Reed: Boyut değişiyor. Formu yeniden boyutlandırırsam (daha büyük hale getir), UserControl ve onun alt denetimleri büyür. Form, daha küçük yapmama izin vermedi. –

+0

Formunuzda UserControl dışında başka bir şey var mı? Kullanıcı denetiminin bulunduğu formda başka bir kapsayıcı varsa ve hte istemci alanı için kullanıcı denetimini "çok büyük" olarak ayarlarsanız, bu davranışı gördüm. Bu yüzden ClientSize olarak değiştirmeyi önerdim. –

1

Şu anda, yakınlaştırma formu yukarıdaki kod ile büyük ama küçültmek mümkün değilim.

Bazı kontroller minSize (veya benzeri) üzerlerinde özelliği vardır. Daha küçük boyutlarda yeniden boyutlandırılamayacak şekilde ayarlanmışlarınız var mı?

+0

@JP: Kontrol edildi ... Sorun görünmüyor ... Teşekkürler –

İlgili konular