#c# #wpf #canvas #drawing
#c# #wpf #холст #рисование
Вопрос:
В настоящее время я заполняю свое MainWindow слегка прозрачным черным цветом: Но я хочу, чтобы в нем была «дыра», где этот эффект не возникает, которая должна выглядеть следующим образом: Поэтому это нужно сделать во время выполнения, поскольку область, которую представляет отверстие, будет меняться несколько раз во время выполнения программы.
Что, как я думал, я мог бы сделать
-
Поэтому сначала я подумал, что мог бы просто вырезать область посередине, как вы могли бы сделать с графическим объектом, но слегка прозрачный черный цвет — это не что иное, как прямоугольник, который добавляется как дочерний элемент на холст, который в настоящее время выполняется следующим образом:
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);
Но я не смог найти какой-либо способ добиться этого эффекта вырезания.
- Создание 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, и все будет «темным».