wpf - 在 WPF 中使用另一个控件作为不透明蒙版?

标签 wpf controls transparency opacity mask

我正在尝试将 OpacityMask 属性与 VisualBrush 结合使用,以便当您将图像拖动到另一个控件(例如另一个图像、矩形或任何其他控件)上时,第二个控件上的图像部分具有不同的不透明度。也就是说,图像具有一些非零基础不透明度,并且图像的任何位于另一个控件上方的部分都具有不同的(同样,非零)不透明度。

这是否可能仅使用 VisualBrush 和 OpacityMask?还是需要更复杂的方法?

谢谢!

编辑:我试图使图像具有较低的不透明度(例如 0.5),并且被拖动到控件上的部分具有较高的不透明度(例如 1.0)。我最初省略了这个细节,这对所采取的方法很重要。

最佳答案

除了 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 的方法可能更容易。
与无掩码方法相比,此解决方案的一个优点是,如果掩码控件移动、更改大小等,它将自动获取更改,而无需保持另一个控件与其同步。
这是它的外观:

(来源:yfrog.com)

关于wpf - 在 WPF 中使用另一个控件作为不透明蒙版?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1233884/

相关文章:

c# - 如何使用 MVVM 在 WPF 中实现 NetworkAvailabilityChanged?

c# - 使 control.Parsecontrol(HTMLString) 通过 Div 元素而不是 Br 元素过滤 Literalcontrol

javascript - 想要为全屏视频背景上的音频创建自定义静音/取消静音按钮

javascript - 您如何正确检测浏览器对不透明度的支持?

c# - 如何更改 wpf listview 项目文本

c# - 如何在一个 Collection View 源上应用多个过滤器函数,一个接一个(AND 关系)

c# - WPF 数据模板和自动创建的 viewModel 对象

c# - 更改禁用控件的 TextColor

mongodb - 使用 mongodb 进行故障转移

css - 剪裁或倒 Angular 图像的 Angular 以查看背景