Как переопределить все фигуры в определенной области WPF

#c# #wpf #canvas #drawing

#c# #wpf #холст #рисование

Вопрос:

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

Что, как я думал, я мог бы сделать

  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 прямоугольников, которые выглядели бы примерно так:введите описание изображения здесь но этот способ выполнения не показался мне наиболее эффективным способом достижения этой цели.

Спасибо за любую помощь!

Ответ №1:

Создайте комбинированную геометрию, вырезав меньший квадрат из большего, а затем используйте его с контуром. То, как вы его измените, будет зависеть от вашего приложения, 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>
  

введите описание изображения здесь

Затем, чтобы изменить размер внутренней геометрии, вы можете либо привязать ее прямоугольник к свойству view model, либо изменить его непосредственно в коде:

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

Комментарии:

1. Это довольно хорошо, но мне нужно иметь возможность устанавливать положение и ширину / высоту curRect в пикселях, возможно ли это как-то?

2. Конечно, просто избавьтесь от viewbox. Вам также нужно будет установить размеры первого прямоугольника в соответствии с вашей клиентской областью.

3. Я удалил окно просмотра и установил размеры первого прямоугольника, но как бы я установил ширину / высоту и положение курсора по пикселям?

4. Просто измените то, что вы передаете в прямоугольную структуру, т. е. cutRect.Rect = new Rect(x, y, w, h); , где x / y / w / h в пикселях. И убедитесь, что вы также заменили Rect="0,0,4,4" на Rect="0,0,clientWidth,clientHeight" .

5. Да, я пытался cutRect.Rect = new Rect(x, y, w, h); , но это вообще не отобразит cutRect, и все будет «темным».