0
点赞
收藏
分享

微信扫一扫

WPF WindowsFormsHost透明方案

星河出山 2022-04-21 阅读 27
wpfc#.net

目录

介绍

在WPF中,如果你需要在WPF中使用Winform控件,你将需要使用WindowsFormsHost作为宿主,具体的原理是,WindowsFormsHost在当前的位置以及尺寸,在占用一块区域叠加Winform控件。这里具体可以参考HwndHost.

问题

问题:在WPF半透明窗口中显示WindowsformHost

  • 思路1: AllowTransparent 在WPF中,窗口最常见的透明方案是通过AllowTransparent=True来达到窗口半透明。这个方法会导致在WindowsFormHost中根据句柄播放视频没有画面。

  • 思路2:使用WindowChrome 通过查阅了大佬们的文章:

WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True) - walterlv

使用 WPF 做一个可以逼真地照亮你桌面的高性能阳光 - walterlv

WPF 制作支持点击穿透的高性能的透明背景异形窗口

基于林德熙与walterlv两位大佬提出半透明背景方法, 并组合通过WindowsFormHost能够使出现神奇的效果。

方案

WindowsFormHost黑色不透明 与 窗口颜色叠加

WindowsFormsHost.Background ='Transparent'

在这里插入图片描述

<Window x:Class="HighPerformanTransparentWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        ResizeMode="NoResize"
        WindowStyle="None"
        Background="#00FFFFFF"
        AllowsTransparency="False"
        Title="WindowChrome测试" 
        Height="420" Width="640">
    <WindowChrome.WindowChrome>
        <WindowChrome GlassFrameThickness="-1" />
    </WindowChrome.WindowChrome>

    <Border Background="#8080D8D8" CornerRadius="20">
        <WindowsFormsHost Background="Transparent" Margin="20">
            <wf:Panel x:Name="panel"/>
        </WindowsFormsHost>
    </Border>
</Window>

WindowsFormHost黑色 不透明 与 半透明窗口颜色不叠加

WindowsFormsHost.Background ='#00FFFFFF' 任意透明的颜色值,都将为黑色

wf:Panel.BackColor="Transparent"

在这里插入图片描述

<Window x:Class="HighPerformanTransparentWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        ResizeMode="NoResize"
        WindowStyle="None"
        Background="#00FFFFFF"
        AllowsTransparency="False"
        Title="WindowChrome测试" 
        Height="420" Width="640">
    <WindowChrome.WindowChrome>
        <WindowChrome GlassFrameThickness="-1" />
    </WindowChrome.WindowChrome>

    <Border Background="#8080D8D8" CornerRadius="20">
        <WindowsFormsHost Background="#00FFFFFF" Margin="20">
            <wf:Panel x:Name="panel" BackColor="#FF0000"/>
        </WindowsFormsHost>
    </Border>
</Window>

WindowsFormHost 下的Winform控件半透明

WindowsFormsHost.Background ='Black' 任意非透明颜色

wf:Panel.BackColor="#80FF0000" 这里透明度取值为01~FE, FE差不多为实色, 如果是FF则会变成一种高反差效果?

在这里插入图片描述

<Window x:Class="HighPerformanTransparentWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        mc:Ignorable="d"
        ResizeMode="NoResize"
        WindowStyle="None"
        Background="{x:Null}"
        AllowsTransparency="False"
        Title="WindowChrome测试" 
        Height="420" Width="640">
    <WindowChrome.WindowChrome>
        <WindowChrome GlassFrameThickness="-1" />
    </WindowChrome.WindowChrome>

    <Border Background="#80000000" CornerRadius="20">
        <WindowsFormsHost Background="Black" Margin="20">
            <wf:Panel x:Name="panel" BackColor="Transparent" />
        </WindowsFormsHost>
    </Border>
</Window>

WindowsFormHost下的Winform控件半透明反差效果

WindowsFormsHost.Background =‘Black’ ` 任意非透明颜色

wf:Panel.BackColor="#FFFF0000" or red

在这里插入图片描述

这个就补贴代码了,替换上面的颜色值即可!

闪烁

在窗口不透明的时候会WindowsFormsHost内的控件会出现闪烁,类似下面的效果:

总结

可参考如下表:

WF不透明黑色 叠加窗体颜色WF不透明黑色WF半透明WF半透明反差
半透明颜色N/AN/AN/A任意
WindowsformHostTransparent or {x:Null}#00FFFFFF 任意透明值BlackBlack
WinformPanelN/AN/A#80FF0000半透明值。任意实色值, Black则为全透明
是否闪烁
举报

相关推荐

0 条评论