如何覆盖特定区域WPF中的所有形状

时间:2019-03-03 23:09:11

标签: c# wpf canvas drawing

目前,我正在用略透明的黑色填充MainWindow: enter image description here 但我希望它有一个不会出现这种影响的“洞”,该洞应如下所示:enter image description here 因此,这需要在运行时完成,因为在程序运行时,孔所代表的区域将多次更改。

我以为我可以做的事

  1. 所以起初我以为我可以将中间的区域切开 就像您可以使用Graphics对象一样,但是稍微 透明黑色不过是一个矩形,它作为子级添加到了画布上,当前是这样完成的:

    var background = new System.Windows.Shapes.Rectangle
                {
                    Fill = new SolidColorBrush(System.Windows.Media.Color.FromArgb(150, 0, 0, 0)),
                    Width = ScreenInfo.Width,
                    Height = ScreenInfo.Height
                };
                MainCanvas.Children.Add(background); 
    

    但是我无法以任何方式实现这种剪切效果。

  2. 创建4个看起来像这样的矩形:enter image description here,但是在我看来,这种实现方式并不是实现这一目标的最有效方式。

感谢您的任何帮助!

1 个答案:

答案 0 :(得分:1)

通过从较大的正方形中切出较小的正方形,然后将其与路径一起使用来创建CombinedGeometry。如何调整大小取决于您的应用程序,对于大多数情况,Viewbox可能就足够了:

<Grid>
    <TextBlock Text="Hello World!" FontSize="200" Foreground="Red" TextWrapping="Wrap" TextAlignment="Center"/>

    <Viewbox Stretch="UniformToFill">
        <Path Fill="#C0000000">
            <Path.Data>
                <CombinedGeometry GeometryCombineMode="Exclude">
                    <CombinedGeometry.Geometry1>
                        <RectangleGeometry Rect="0,0,4,4" />
                    </CombinedGeometry.Geometry1>
                    <CombinedGeometry.Geometry2>
                        <RectangleGeometry x:Name="cutRect" Rect="1,1,2,2" />
                    </CombinedGeometry.Geometry2>
                </CombinedGeometry>
            </Path.Data>
        </Path>
    </Viewbox>

</Grid>

enter image description here

然后,要更改内部几何图形的大小,可以将其Rect绑定到视图模型属性,也可以直接在代码隐藏中更改它:

cutRect.Rect = new Rect(1, 1, 1, 1);