walterlv / BlogComments

3 stars 0 forks source link

post/wpf-transparent-window-without-allows-transparency #29

Open utterances-bot opened 4 years ago

utterances-bot commented 4 years ago

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

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

https://blog.walterlv.com/post/wpf-transparent-window-without-allows-transparency.html

DinoChan commented 4 years ago

亲测有效,居然以前没试出这种组合,这个组合很合情合理啊,以前的我真傻。

walterlv commented 4 years ago

@DinoChan 我也没试过这种组合,汗……还是我们团队的另一个小伙伴告诉我的,只是没提炼出这三个必要条件而已。

lifei8142556 commented 4 years ago

这确实是个很好的方法

walterlv commented 4 years ago

@lifei8142556 不过窗口不能通过拖拽到顶部最大化,这是个问题。对于制作固定大小的透明窗口来说不错。其中的原理可能是这个:

nocanstillbb commented 4 years ago

试用了真香, 谢谢水哥 经试用发现 WindowChrome的方式透明窗口 与 AllowsTransparency=true透明窗口还有一个区别 WindowChrome 实现的透明wpf窗口会捕获透明区域的鼠标事件 AllowsTransparency实现的透明wpf窗口不会抹茶透明区域的鼠标事件(下面的窗口响应了鼠标事件)

walterlv commented 4 years ago

@nocanstillbb 这真是一个有趣的发现,于是我们可以做更多事情了!

luwei888 commented 4 years ago

你好,请教一下,我在使用的WindowChrome的时候发现拖动左边框的时候右边框很不和谐,有什么好办法能够解决么?

walterlv commented 4 years ago

@luwei888 并没有好的办法,我也在寻找。你可以阅读这篇文章了解更详细的情况:

luwei888 commented 4 years ago

@walterlv 这是wpf的渲染原因还是WindowChrome的问题,我可能需要自己编写拖动边框的代码了

walterlv commented 4 years ago

@luwei888 WPF 的渲染与 Windows 操作系统的渲染不同步。它们两者都不知道对方的渲染时机,做不到同步渲染,于是出现了时间差。

luwei888 commented 4 years ago

@walterlv 不好意思,再请教一下,那wpf做无异常的边框缩放窗口,应该使用什么方案解决呢?

walterlv commented 4 years ago

@luwei888 目前没有什么好方法,你可以观察系统自带的那些程序,也在常使用各种方法来解决这样的问题,但都不完美。

xixifather commented 4 years ago

WindowChrome 透明窗口捕获鼠标事件 ,那个如何做穿透效果呢?

dotnet9 commented 4 years ago

谢谢作者,已转载本文:https://dotnet9.com/?p=2854

lhyAira commented 3 years ago

WindowChrome有一个问题,设置了后对窗口进行缩放,会十分卡顿,尤其在拉伸左侧边框这是什么原因呢?

wf-soft commented 3 years ago

始终无法找到一个在可缩放下可用的透明WindowChrome

superowner commented 2 years ago

虽然WindowChrome效率接近原生,但是还是不能鼠标点击穿透啊,看来还是AllowsTransparency="True"牛皮

lhyAira commented 2 years ago

感谢大神 学习了

lhyAira commented 2 years ago

有什么办法做事件穿透么,下层窗体获取不到事件

walterlv commented 2 years ago

@lhyAira https://blog.lindexi.com/post/WPF-%E5%88%B6%E4%BD%9C%E6%94%AF%E6%8C%81%E7%82%B9%E5%87%BB%E7%A9%BF%E9%80%8F%E7%9A%84%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84%E9%80%8F%E6%98%8E%E8%83%8C%E6%99%AF%E5%BC%82%E5%BD%A2%E7%AA%97%E5%8F%A3.html

Dev-Wiki commented 2 years ago

在 windows7 系统下 会有黑边怎么处理呢?

还有就是这种实现也会影响 webview2 在windows7 下的渲染, 有没有好的解决方案呢?

walterlv commented 2 years ago

@Dev-Wiki 需要判断一下 DwmIsCompositionEnabled,如果为 false 就需要开启 AllowsTransparency。这部分用户大约占 Windows 7 的 6% 左右,是那些无法开启 Aero 的用户。

https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/nf-dwmapi-dwmiscompositionenabled

Dev-Wiki commented 2 years ago

@walterlv 我这是在虚拟机测试的. 本来是解决 AllowsTransparency=True 导致的 WebView2 加载网页显示空白问题. 如果在开启就还会出现空白了. 其实按照WindowChrome的方式设置透明, 在Win7 虚拟机里面会出现渲染问题. 网页闪烁.

Dev-Wiki commented 2 years ago

@walterlv 我录了一个视频, 三种有不同的表现, 现在深受困扰. webview2 在windows7 的系统下, 使用 不同的窗口设置显示问题. https://nas.devwiki.net/share.cgi?ssid=75651c8ed4764d91814fc5b5e88874d2&ep=&fid=75651c8ed4764d91814fc5b5e88874d2&open=normal)

walterlv commented 2 years ago

@walterlv 我录了一个视频, 三种有不同的表现, 现在深受困扰. webview2 在windows7 的系统下, 使用 不同的窗口设置显示问题. https://nas.devwiki.net/share.cgi?ssid=75651c8ed4764d91814fc5b5e88874d2&ep=&fid=75651c8ed4764d91814fc5b5e88874d2&open=normal)

在 Windows 下制作非标准形状的窗口会遇到各种各样的问题,除了对老旧的系统兼容不好之外,还要处理各种边界情况和性能问题。所以我强烈建议,如果产品要长期维护的话,跟产品和视觉好好谈一谈,不要折腾那些独树一帜的窗口外形了(尤其是圆角,没有特别必要的情况下还牺牲了一大堆开发效率、产品性能和功能稳定性)。

wutangyuan commented 2 years ago

水哥,我发现用WindowChrome替换AllowsTransparency=True,会出现一个问题,在桌面上播放一个Gif图,然后打开WindowChrome的透明窗体,透过窗体看Gif图,动图不动了!

walterlv commented 2 years ago

@wutangyuan 这是最近新出的一项优化,目前尚在讨论中:

hycomd commented 2 months ago

遇到当自定义TextBox的Validation.ErrorTemplate时,期望在底部显示报错信息但是定义了Window.Template会不显示。 具体ErrorTemplate类似于

<ControlTemplate x:Key="validationTemplate">
    <DockPanel>
        <TextBlock DockPanel.Dock="Bottom" Foreground="Red" FontSize="12" Text="{Binding [0].ErrorContent}" />
        <AdornedElementPlaceholder />
    </DockPanel>
</ControlTemplate>

需要在Window.Template的ContentPresenter外包一层AdornerDecorator,这样Validation.ErrorTemplate可以正常显示。

<Window.Template>
    <ControlTemplate>
        <Border ...>
            <Border ...>
                <AdornerDecorator>
                    <ContentPresenter />
                </AdornerDecorator>
            </Border>
        </Border>
    </ControlTemplate>
</Window.Template>

分享一下

SlimeNull commented 2 weeks ago

大佬, 引用的林德熙的那篇文章, 链接寄啦, 需要更新