2009-08-05 14 views
7

OpacityMask özelliğini bir VisualBrush ile birlikte kullanmaya çalışıyorum, böylece bir görüntüyü başka bir denetimin üzerine sürüklediğinizde (başka bir görüntü, dikdörtgen veya başka bir denetim gibi), resmin ikinci kontrolün üzerindeki kısmı. farklı bir opaklığa sahiptir. Yani, görüntünün sıfır olmayan bir baz opaklığı vardır ve görüntünün herhangi bir parçasının başka bir kontrolün üzerinde bir başka (tekrar, sıfır olmayan) opaklığı vardır.WPF'de başka bir denetim opaklık maskesi olarak mı kullanıyorsunuz?

Bu, VisualBrush ve OpacityMask kullanılarak kolayca yapılabilir mi? Yoksa daha karmaşık bir yaklaşım mı gerekiyor?

Teşekkürler!

Düzenleme: Görüntünün biraz daha düşük opaklığa (örneğin, 0,5) sahip olmasını sağlamaya çalışıyorum ve denetimin üzerinde sürüklenen parça daha yüksek bir opaklığa (1.0 gibi) sahip. Bu detayı aslında bıraktım, ki bu yaklaşımın benimsenmesi için önemli.

+0

Ben kontrolü şeklinde şeklini şeklinde ve Resim veya şekil kullanmak fikrim yok nesneyi taşıdığınızda OpacityMask ofset, ama bu ile karıştırmasını Genelde iyi bir çözüm olmaz, özellikle de maske olarak kullanmak istediğiniz kontrol dinamikse (benim durumumda değilse). – nsantorello

+0

Genelde iyi bir çözüm olmayacağından bahsetmeyi unuttum çünkü görüntüde bir çeşit temel opaklık olmasını isteseydiniz (ki bunu yapardım). büyük (büyük ofsetler veya büyük maskelenebilen görüntüler için uyum sağlamak için). – nsantorello

+0

sadece 34 temsilcisi var, 150 rep ödülünü nasıl başlattın? – Sadegh

cevap

2

ima'nın cevabına ek olarak, bunu çözdüm bir opaklık maskesi kullanarak. Görüntü için LayoutUpdated olayına bağlanan aşağıdaki kodu kullanıyorum.

// Make a visual brush out of the masking control. 
VisualBrush brush = new VisualBrush(maskingControl); 
// Set desired opacity. 
brush.Opacity = 1.0; 
// Get the offset between the two controls. 
Point offset = controlBeingMasked.TranslatePoint(new Point(0, 0), maskingControl); 
// Determine the difference in scaling. 
Point scale = new Point(maskingControl.ActualWidth/controlBeingMasked.ActualWidth, 
    maskingControl.ActualHeight/controlBeingMasked.ActualHeight); 
TransformGroup group = new TransformGroup(); 
// Set the scale of the mask. 
group.Children.Add(new ScaleTransform(scale.X, scale.Y, 0, 0)); 
// Translate the mask so that it always stays in place. 
group.Children.Add(new TranslateTransform(-offset.X, -offset.Y)); 
// Rotate it by the reverse of the control, to keep it oriented correctly. 
// (I am using a ScatterViewItem, which exposes an ActualOrientation property) 
group.Children.Add(new RotateTransform(-controlBeingMasked.ActualOrientation, 0, 0)); 
brush.Transform = group; 
controlBeingMasked.OpacityMask = brush; 

İstenilen baz opaklığını istiyorsanız, iki görüntüyü kullanın; Her zaman temel opaklıkta ve diğerinin üstünde duran opaklık maskesini kullanan bir tane. Temel opaklığın maskelenen opaklıktan daha yüksek olmasını istiyorsanız, ima'nın yaklaşımını kullanmak daha kolay olabilir.

Bu çözümün, maskesiz yaklaşımın aksine bir avantajı, maskeleme kontrolü hareket ettiğinde, boyut değiştirir vb., Bununla birlikte başka bir denetim sürdürmek zorunda kalmadan değişikliği otomatik olarak alabilmesidir. İşte

böyle görünüyor: http://img149.yfrog.com/img149/4183/99793865.jpg

+0

Daha önce de belirtildiği gibi, eğer temel opaklık> maskelenmiş opaklık istiyorsanız, iki görüntü kullandığı için bu yaklaşımı kullanabileceğinizi düşünmüyorum ve sadece opaklık ekleyebilir, çıkartamazsınız. Yaklaşım ima, temel bir opaklık> maskeli opaklık için muhtemelen en iyi ihtimalle önerecektir. Ama çözümümün tersine yapmak için harika bir yol olduğuna inanıyorum. – nsantorello

1
  • Resim maskeleri
  • bu doğru fırça
  • sürükleyip görüntü şekli ve kontrol
  • ayarlayın donukluk ile arası kontrolü üstündeki kontrol
  • Boya şekli, görsel bir fırça tanımlama istenen etkiyi elde etmek için fırça
+0

Henüz denemedim, ancak kontrol üzerinde daha düşük bir opaklığa sahip olmak istesem de bu harika olurdu. Ya daha yüksek bir opaklık istiyor olsaydım (diğer bir deyişle Opacity = 0,5 ve Opacity = 1.0'daki kontrolün üzerindeki görüntü var mı?)? Bu yaklaşımın sadece görüntünün opaklığını azaltabileceğini, arttırmayacağını düşünürdüm. Yanılıyorsam lütfen beni düzeltin. Teşekkürler. :) – nsantorello

+0

Asıl sorumu bu gereksinimi belirtmediğimi fark ettim. Bunu dahil etmek için soruyu düzenledim. – nsantorello

+0

hasty ve yanlış güncellemeleri sildi – ima

İlgili konular