Çift arabelleğe almanın çözebileceği bir titreşim türü değildir. BeginUpdate veya SuspendLayout. Çok fazla kontrolünüz var, BackgroundImage bunu çok daha kötü hale getirebilir .
UserControl kendi kendini boyadığında başlar. BackgroundImage'ı çizerek çocuk kontrol pencerelerinin gittiği yerde delikler bırakır. Her çocuk kontrol daha sonra kendini boyaması için bir mesaj alır, deliği pencere içeriğiyle doldururlar. Çok fazla kontrole sahip olduğunuzda, bu delikler kullanıcı tarafından bir süre görülebilir. Normalde beyazdırlar ve karanlık olduğunda BackgroundImage ile kötü bir kontrast oluştururlar. Veya formun Opacity veya TransparencyKey özelliği varsa, hemen hemen her şeyle kötü bir tezat oluşturacak şekilde siyah olabilirler.
Bu, Windows Forms'un oldukça temel bir sınırlamasıdır, Windows'un pencereleri işleme biçimine bağlı kalmıştır. WPF btw tarafından düzeltildi, alt kontroller için pencere kullanmıyor. İstediğiniz şey, alt denetimler de dahil olmak üzere tüm formu çift arabelleğe almaktır. Bu mümkün, çözüm için bu başlıktaki kodumu kontrol edin . Yine de yan etkileri vardır ve aslında boyama hızını artırmaz. Kod basittir, bunu formunuza yapıştırın (kullanıcı kontrolüne değil):
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Boyama hızını artırmak için yapabileceğiniz pek çok şey var, öyle ki artık titreme fark edilmiyor. BackgroundImage ile uğraşarak başlayın. Kaynak görüntü büyük olduğunda ve kontrole uyması için küçültülmesi gerektiğinde gerçekten pahalı olabilirler . BackgroundImageLayout özelliğini "Döşeme" olarak değiştirin. Bu fark edilir bir hızlanma sağlarsa, boyama programınıza geri dönün ve görüntüyü tipik kontrol boyutuyla daha iyi eşleşecek şekilde yeniden boyutlandırın. Veya görüntünün uygun şekilde boyutlandırılmış bir kopyasını oluşturmak için UC'nin OnResize () yönteminde kod yazın, böylece kontrol her yeniden boyandığında yeniden boyutlandırılmasına gerek kalmaz. Bu kopya için Format32bppPArgb piksel formatını kullanın, diğer piksel formatlarından yaklaşık 10 kat daha hızlı işler.
Yapabileceğiniz bir sonraki şey, deliklerin bu kadar belirgin olmasını ve görüntüyle kötü bir şekilde kontrast oluşturmasını önlemektir. Şunları yapabilirsiniz kapatmak , UC için bayrak WS_CLIPCHILDREN stil bayrak, çocuk kontrolleri gitmek alanda resimden önler UC. Bu kodu UserControl'ün koduna yapıştırın:
protected override CreateParams CreateParams {
get {
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
Alt kontroller artık kendilerini arka plan görüntüsünün üstüne boyayacak. Hala teker teker boyadıklarını görebilirsiniz, ancak çirkin ara beyaz veya kara delik görünmez.
Son olarak, çocuk kontrollerinin sayısını azaltmak, yavaş boyama problemlerini çözmek için her zaman iyi bir yaklaşımdır. UC'nin OnPaint () olayını geçersiz kılın ve şimdi bir çocukta gösterileni çizin. Özel Etiket ve PictureBox çok israf edicidir. İşaretle ve tıklamak için uygun, ancak hafif alternatifleri (bir dize veya görüntü çizme) OnPaint () yönteminizde yalnızca tek bir kod satırı alır.
UpdateStyles
ayarladıktan sonra aradın mı? Kötü bir şekilde belgelenmiştir, ancak bazen gerekli olabilir.