2009-08-05 31 views
7

我試圖將OpacityMask屬性與VisualBrush結合使用,以便在通過其他控件(例如另一個圖像,矩形或任何其他控件)拖動圖像時,第二個控件上的圖像部分具有不同的不透明度。也就是說,圖像具有一些非零基底不透明度,並且圖像的任何超過另一個控件的部分都具有不同的(也是非零)不透明度。使用另一個控件作爲WPF中的不透明蒙版?

這可能只是使用VisualBrush和OpacityMask?還是需要更復雜的方法?

謝謝!

編輯:我試圖讓圖像具有一些較低的不透明度(如0.5),並且在控件上拖動的部分具有較高的不透明度(如1.0)。我最初忽略了這個細節,這對於採取的方法很重要。

+0

我有這個想法爲使用型控制成型的方式和圖像或形狀與OpacityMask的偏移,當你移動的對象,但亂搞通常不會是一個好的解決方案,特別是如果你想用作掩碼的控件是動態的(在我的情況下不是)。 – nsantorello 2009-08-10 11:47:30

+0

我忘記提及它通常不是一個好的解決方案的原因是因爲如果你想要某種形象的基礎不透明(我這樣做),你將不得不使這個圖像「僞造」控制較大(以適應較大的偏移或較大的可屏蔽圖像)。 – nsantorello 2009-08-10 11:50:31

+0

你剛剛得到34代表,你是如何開始150代表賞金的? – Sadegh 2009-08-11 14:08:18

回答

2

除了ima的回答,我已經想通了使用不透明蒙版。我使用以下代碼掛鉤到圖像的LayoutUpdated事件中。

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

如果您想要所需的基礎不透明度,請使用兩個圖像;一個始終處於基本不透明狀態,另一個使用位於其上的不透明蒙版。如果您希望基礎不透明度高於蒙版不透明度,那麼使用ima的方法可能會更容易。

與無掩模方法相比,此解決方案的一個優點是,如果屏蔽控制移動,更改大小等,它將自動接收更改,而不必保持另一個控件與其同步。

下面是它的外觀: http://img149.yfrog.com/img149/4183/99793865.jpg

+0

正如我所提到的,如果你想基本不透明>蒙面不透明,我不相信你可以使用這種方法,因爲它使用兩個圖像,你只能添加不透明度,而不是減去它。 ima建議的方法可能對於基本不透明度>蒙版不透明度最好。但我相信我的解決方案是一個很好的方式來做相反的事情。 – nsantorello 2009-08-11 14:32:01

1
  • 無掩模
  • 定義視覺刷用於控制
  • 油漆形狀對上與刷
  • 將圖像的形狀和控制
  • 集不透明度之間控制的頂刷子達到預期的效果
+0

我還沒有嘗試過這種方法,但是如果我希望在控件上具有較低的不透明度,看起來這樣會很好。如果我想要更高的不透明度(即在不透明度= 0.5的情況下圖像和在不透明度= 1.0的情況下控制的圖像)?我認爲這種方法只能降低圖像的不透明度,而不會增加圖像的透明度。如果我錯了,請糾正我。謝謝。 :) – nsantorello 2009-08-11 13:49:15

+0

我注意到我沒有在我的問題中最初指定這個要求。我已經編輯過這個問題。 – nsantorello 2009-08-11 13:52:07

+0

刪除草率和錯誤的更新 – ima 2009-08-11 14:08:23