Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个图像层和不透明掩码_C#_Wpf_Image_Xaml_Opacitymask - Fatal编程技术网

C# 两个图像层和不透明掩码

C# 两个图像层和不透明掩码,c#,wpf,image,xaml,opacitymask,C#,Wpf,Image,Xaml,Opacitymask,我试图从一个图像中裁剪出一个圆,然后将它放在WPF中的另一个图像上 圆的中心会根据鼠标的移动而变化,需要动态地限定 我试图将两个图像放置在彼此的顶部,并使用我实时绘制的第三个图像作为不透明度遮罩 你能提供简短的代码来有效地解决这个问题吗 下面的代码描述了如何使用不透明掩码。这有点违反直觉,因为我们希望XAML渲染将元素从下到上分层 但是,在这种情况下,您希望“背景”图像层叠在前景之上,因为不透明贴图将仅用于显示由VisualBrush的位置和大小描述的前景部分,从而使其余部分透明。具体如下: &

我试图从一个图像中裁剪出一个圆,然后将它放在WPF中的另一个图像上

圆的中心会根据鼠标的移动而变化,需要动态地限定

我试图将两个图像放置在彼此的顶部,并使用我实时绘制的第三个图像作为不透明度遮罩

你能提供简短的代码来有效地解决这个问题吗


下面的代码描述了如何使用
不透明掩码
。这有点违反直觉,因为我们希望XAML渲染将元素从下到上分层

但是,在这种情况下,您希望“背景”图像层叠在前景之上,因为不透明贴图将仅用于显示由VisualBrush的位置和大小描述的前景部分,从而使其余部分透明。具体如下:

<Grid x:Name="MainGrid" MouseMove="Grid_MouseMove">
    <Rectangle Fill="Red" ></Rectangle>
    <Rectangle Fill="Green">
        <Rectangle.OpacityMask>
            <VisualBrush Stretch="None" >
                <VisualBrush.Visual>
                    <Ellipse Width="40" Height="40" StrokeThickness="1" Fill="Black"  />
                </VisualBrush.Visual>
                <VisualBrush.RelativeTransform>
                    <TransformGroup>
                        <TranslateTransform x:Name="OpacityFilterTransform" X="1" Y="1"/>
                    </TransformGroup>
                </VisualBrush.RelativeTransform>
            </VisualBrush>
        </Rectangle.OpacityMask>
    </Rectangle>
</Grid>

此解决方案应适用于您想要分层的
Visual
的任何后代

它只是几个SolidBrush对象,还是比这更复杂?
    private void Grid_MouseMove(object sender, MouseEventArgs e)
    {
        var position = e.GetPosition(this);
        var height = MainGrid.ActualHeight;
        var width = MainGrid.ActualWidth;
        // with the position values, interpolate a TranslateTransform for the opacity mask
        var transX = position.X / width;
        var transY = position.Y / height;
        OpacityFilterTransform.X = transX - 0.5;
        OpacityFilterTransform.Y = transY - 0.5;
    }