【问题标题】:Transparent rectangle inside window窗口内的透明矩形
【发布时间】:2012-10-07 16:06:34
【问题描述】:

我有最顶层的全屏窗口

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

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

【问题讨论】:

  • 你试过玩弄它的不透明度吗?
  • @eranotzer 是的,但我认为使用 opacity/opacitymask 是不可能实现的,因为即使我将 Rectangle 设置为透明,它后面的窗口仍然不透明。我需要一个窗口中的“洞”,但我还没有找到任何解决方案如何动态更改“洞”的大小和位置,只有使用 Grid stackoverflow.com/questions/9181962/… 等的静态“洞”。
  • 还有另一种更简单的方法来使用屏幕截图而不是透明窗口,但我不知道如何更改它的颜色。我认为如果每次用户更改选择区域时都逐像素设置它会很慢。

标签: c# wpf transparency


【解决方案1】:

尝试如下操作,并在某些鼠标事件处理程序中动态更改第二个 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>

编辑:一个更简单的解决方案可能是边框。您可以独立调整 BorderThickness 的四个分量。

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

【讨论】:

  • 谢谢 :) 我认为这是解决方案。看起来我可以在不附加到网格的情况下获取鼠标事件。
  • 不客气。请查看编辑,使用边框可能更容易。
  • 好的,谢谢。但我认为 Rect 坐标更直观,更易于使用。顺便说一句,我对使用第一个解决方案或边框附加到 Window 的鼠标事件没有任何问题。
猜你喜欢
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多