将WPF窗口与桌面混合

时间:2014-04-16 01:31:31

标签: c# wpf xaml

是否可以(以及如何)调整用于在桌面上显示WPF表单的混合模式?

我有一个窗口作为整个屏幕的叠加层。这是XAML:

<Window x:Class="RedGreenBarsWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Red/Green Overlay" Topmost="True" Height="300" Width="525" AllowsTransparency="True" WindowStyle="None" Background="Transparent" WindowStartupLocation="Manual" IsHitTestVisible="False">
    <Canvas Name="canvas" />
</Window>

无法点击它,当窗口加载时,它会调整大小并移动到覆盖整个屏幕。然后,我在画布上绘制一些形状,如下所示:

System.Windows.Media.Brush red = new SolidColorBrush(System.Windows.Media.Color.FromArgb(200, 255, 0, 0));

System.Windows.Size s = new System.Windows.Size(System.Windows.SystemParameters.PrimaryScreenWidth, System.Windows.SystemParameters.PrimaryScreenHeight);

int lines = 20;
for (double i = 0; i < s.Width; i += s.Width / lines)
{
    System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle
    {
        Width = s.Width / lines,
        Height = s.Height
    };

    rect.Fill = red;

    Canvas.SetTop(rect, 0);
    Canvas.SetLeft(rect, i * 2);
    canvas.Children.Add(rect);
}

这正是它应该做的,但不是我想要的。这是在Photoshop中完成的可视化(我的看起来像“正常”):

enter image description here

我需要想办法让它看起来像右边的红色框,文字没有被覆盖的颜色所照亮。我已经搜索了高低,虽然有些库可以通过Window中的元素实现这一点,但我需要混合模式来扩展整个桌面。怎么办呢?

1 个答案:

答案 0 :(得分:1)

您需要使用不同的混合功能。到目前为止,我相信你没有简单的解决方案;已经提出要求,但WPF尚未支持。

这个other question也是关于为WPF画笔使用不同的混合函数。它还包含一个非常好(但很长)的教程链接,该教程介绍了如何实现自定义混合(实际上它是一个完整的混合库)。

这些页面包含几乎每页都有源代码的拉链。您需要以下内容来构建它们:(引用).NET 3.5 SP1,DirectX SDK以及CodePlex上WPF Futures内容中的着色器效果构建任务和模板。

我在这里复制链接:

编辑:要捕获桌面图片,您可以尝试使用简单的FrameworkElement,例如Rectangle,并使用透明背景(Transparent是画笔)。然后,您可以使用RenderTargetBitmap类将其转换为ImageBrush。这是一个代码片段,可以帮助您入门:

public Brush RectangleToBrush(Rectangle rect)
{
    int w = (int)rect.ActualWidth;
    int h = (int)rect.ActualHeight;
    var rtb = new RenderTargetBitmap(w, h, 96d, 96d, PixelFormats.Default);
    rtb.Render(rect);

    ImageBrush brush = new ImageBrush(BitmapFrame.Create(rtb));

    return brush;
}

您可以使用网格将此矩形放在.xaml文件中,使其覆盖整个窗口:

<Window ...>
    <Grid>
        <Rectangle x:Name="DesktopCaptureRectangle"/>
        <Grid>
            <!-- Your controls here -->
        </Grid>
    </Grid>
</Window>

注意:我不确定此解决方案在性能方面是否良好......