Как переопределить все фигуры в определенной области WPF - PullRequest
0 голосов
/ 04 марта 2019

В настоящее время я заполняю свое главное окно слегка прозрачным черным цветом: enter image description here Но я хочу, чтобы в нем была «дыра», где этот эффект не имеет места, который должен выглядеть следующим образом: enter image description here Таким образом, это необходимо сделать во время выполнения, поскольку область, которую представляет отверстие, будет меняться несколько раз во время работы программы.

То, что я думал, что смогу сделать

  1. Сначала я подумал, что могу просто вырезать область посередине, как вы могли бы сделать с графическим объектом, нослегка прозрачный черный - это не что иное, как прямоугольник, который добавляется в качестве дочернего элемента на холсте, который в настоящее время выполняется следующим образом:

    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 голосов
/ 04 марта 2019

Создайте 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);
...