2009-08-05 15 views
7

Próbuję użyć właściwości OpacityMask w połączeniu z obiektem VisualBrush, aby po przeciągnięciu obrazu nad inną formantem (takim jak inny obraz, prostokąt lub dowolna inna kontrolka) część obrazu znajdująca się nad drugą kontrolką ma inne krycie. Oznacza to, że obraz ma pewną niezerową nieprzezroczystość bazową, a jakakolwiek część obrazu nad inną kontrolką ma inne (ponownie niezerowe) krycie.Użyj innej kontrolki jako maski krycia w WPF?

Czy jest to możliwe po prostu za pomocą VisualBrush i OpacityMask? Lub czy wymagane jest bardziej złożone podejście?

Dzięki!

Edytuj: Próbuję sprawić, aby obraz miał nieco niższą krycie (np. 0,5), a część przeciągnięta nad formantem ma wyższe krycie (na przykład 1.0). Pierwotnie pominięto ten szczegół, co jest ważne w przyjętym podejściu.

+0

Mam pomysł wykorzystania obraz lub kształt, który jest ukształtowany tak, kontrola jest ukształtowany i bawić z offset OpacityMask podczas przesuwania obiektu, ale że generalnie nie byłoby dobrym rozwiązaniem, szczególnie jeśli kontrola, którą chciałbyś użyć jako maski, jest dynamiczna (w moim przypadku taka nie jest). – nsantorello

+0

Zapomniałem wspomnieć o przyczynie, dla której nie byłoby to na ogół dobrym rozwiązaniem, ponieważ gdybyś chciał jakiegoś rodzaju nieprzezroczystości bazy na obrazie (co, ja robię), musiałbyś zrobić ten obraz, który "podrabiał" kontrolę bardzo duże (w celu dostosowania do dużych przesunięć lub dużych maskowych obrazów). – nsantorello

+0

właśnie dostałeś 34 powtórzenia, jak zaczęłaś nagrodę 150 rep? – Sadegh

Odpowiedz

2

Oprócz odpowiedzi ima, wymyśliłem to za pomocą maski krycia. Korzystam z następującego kodu zahaczonego o zdarzenie LayoutUpdated dla obrazu.

// 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; 

Jeśli chcesz uzyskać pożądane krycie bazy, użyj dwóch obrazów; taki, który zawsze znajduje się w podstawowym kryciu, a drugi używa maski krycia, która znajduje się na wierzchu. Jeśli chcesz, aby krycie bazowe było wyżej niż maskowane krycie, łatwiej będzie użyć podejścia ima.

Zaletą tego rozwiązania w przeciwieństwie do podejścia bezmasowego jest to, że jeśli sterowanie maskowaniem przesunie się, zmieni rozmiar itp., To automatycznie podniesie zmianę bez konieczności utrzymywania z nią kolejnej kontroli.

Oto jak to wygląda: http://img149.yfrog.com/img149/4183/99793865.jpg

+0

Jak już wspomniałem, jeśli chcesz mieć nieprzezroczystość bazową> zamaskowany, nie sądzę, żebyś mógł skorzystać z tej metody, ponieważ używa dwóch obrazów i możesz dodawać krycie, a nie odejmować. Podejście, jakie sugeruje ima, byłoby prawdopodobnie najlepsze dla nieprzezroczystości kryjącej w oparach bazowych. Wierzę jednak, że moje rozwiązanie to świetny sposób na zrobienie tego na odwrót. – nsantorello

1
  • Brak maski
  • Zdefiniuj pędzel wizualną kontrolę
  • farby kształt prawo na górze kontroli z tym pędzlem
  • Drag obrazu między kształt i kontrola
  • Ustaw krycie szczotka do osiągnięcia pożądanego efektu
+0

Jeszcze nie próbowałem tego, ale wygląda na to, że byłoby wspaniale, gdybym chciał mieć niższą krycie nad kontrolą. Co się stanie, jeśli chcę mieć większy krycie (tzn. Mieć obraz przy Kryciu = 0,5 i część nad kontrolą przy Opacity = 1,0)? Sądzę, że takie podejście może jedynie zmniejszyć krycie obrazu, a nie go zwiększyć. Proszę popraw mnie jeżeli się mylę. Dzięki. :) – nsantorello

+0

Zauważam, że początkowo nie określiłem tego wymogu w moim pytaniu. Zmieniłem to pytanie, aby uwzględnić to. – nsantorello

+0

usunięto pochopne i błędne aktualizacje – ima