2012-10-07 16 views
0

У меня есть TOPMOST полноэкранногопрозрачный прямоугольник внутри окна

AllowsTransparency="True" WindowStyle="None" Topmost="True" WindowState="Maximized" Left="0" Top="0" 
OpacityMask="#2B000000" Background="Black" Cursor="Cross" 

и я рисую прямоугольник, когда пользователь держит LMB и перемещает мышь (это выбор, как на скриншоте в этом моем вопросе Easiest way to select screen region).

Я хочу сделать прямоугольник полностью прозрачным, чтобы увидеть содержимое за окном. Но я не могу сделать его более прозрачным, чем родительское окно. Что мне делать?

+0

Вы пытались сыграть с его непрозрачностью? –

+0

@eranotzer Да, но я думаю, что достичь непрозрачности/opacitymask невозможно, потому что даже если я устанавливаю Rectangle прозрачным, то окно за ним все еще не прозрачно. Мне нужно «отверстие» в окне, но я не нашел решения, как изменить размер и положение «дыры» динамически, только статические «дыры» с помощью Grid http://stackoverflow.com/questions/9181962/made -a-rectangle-full-transparent-a-hole-in-the-window-wpf и так далее. – AlexP11223

+0

Также есть еще один более простой подход к использованию скриншота вместо прозрачного окна, но я не уверен, как изменить его цвет. Я думаю, что это будет очень медленно, если я буду устанавливать пиксель за пикселем каждый раз, когда пользователь меняет область выбора. – AlexP11223

ответ

3

Попробуйте что-нибудь вроде ниже и динамически измените размер и расположение второй 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> 
+0

Спасибо :) Я думаю, что это решение. Также похоже, что я могу получать события мыши без привязки к сетке. – AlexP11223

+1

Добро пожаловать. См. Редактирование, возможно, еще проще с помощью Border. – Clemens

+0

Да, спасибо. Но я думаю, что координаты Rect более интуитивно понятны и просты в использовании. Кстати, у меня нет никаких проблем с событиями мыши, привязанными к окну, либо с использованием первого решения или границы. – AlexP11223

Смежные вопросы