Попробуйте что-нибудь вроде ниже и динамически измените размер и расположение второй RectangleGeometry (selectRect) в каком-либо обработчике событий мыши. И, возможно, также отрегулируйте размер первой RectangleGeometry на размер экрана.
<Window x:Class="TransparentRectangle.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
WindowStyle="None" WindowState="Maximized"
AllowsTransparency="True" Background="Transparent">
<Grid>
<Path Fill="Black" Opacity="0.5">
<Path.Data>
<CombinedGeometry GeometryCombineMode="Exclude">
<CombinedGeometry.Geometry1>
<RectangleGeometry x:Name="screenRect" Rect="0,0,2000,2000"/>
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<RectangleGeometry x:Name="selectRect" Rect="100,100,200,100"/>
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
</Grid>
</Window>
Проблема может быть, однако, что вы не получите какие-либо события мыши в исключенной части CombinedGeometry. Чтобы этого не произошло, вы можете прикрепить обработчики мыши к окну (вместо пути) и дать ему почти прозрачный фон.
<Window ... Background="#01000000" MouseMove=... etc>
...
</Window>
EDIT: Еще более простым решением может быть граница. Вы можете самостоятельно настроить четыре компонента BorderThickness.
<Grid ...>
<Border BorderBrush="Black" Opacity="0.5" BorderThickness="100,100,200,400"/>
</Grid>
Вы пытались сыграть с его непрозрачностью? –
@eranotzer Да, но я думаю, что достичь непрозрачности/opacitymask невозможно, потому что даже если я устанавливаю Rectangle прозрачным, то окно за ним все еще не прозрачно. Мне нужно «отверстие» в окне, но я не нашел решения, как изменить размер и положение «дыры» динамически, только статические «дыры» с помощью Grid http://stackoverflow.com/questions/9181962/made -a-rectangle-full-transparent-a-hole-in-the-window-wpf и так далее. – AlexP11223
Также есть еще один более простой подход к использованию скриншота вместо прозрачного окна, но я не уверен, как изменить его цвет. Я думаю, что это будет очень медленно, если я буду устанавливать пиксель за пикселем каждый раз, когда пользователь меняет область выбора. – AlexP11223