窗口内的透明矩形

时间:2012-10-07 16:06:35

标签: c# wpf transparency

我有最顶层的全屏窗口

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中的截图一样)。

我想让矩形完全透明,以查看窗口后面的内容。但我不能让它比父窗口更透明。我该怎么办?

1 个答案:

答案 0 :(得分: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(而不是Path),并为其提供几乎透明背景。

<Window ... Background="#01000000" MouseMove=... etc>
    ...
</Window>

编辑:一个更简单的解决方案可能是边境。您可以单独调整BorderThickness的四个组件。

<Grid ...>
    <Border BorderBrush="Black" Opacity="0.5" BorderThickness="100,100,200,400"/>
</Grid>