WPF透明边框导致UI停止重绘
作为我上一个问题的跟进,我想知道如何正确使用透明窗口。如果我将窗口设置为使用透明度,则UI有时会似乎停止响应。实际发生的是,UI根本没有按应有的方式进行更新。不会出现动画,页面也不会导航;但是,如果我们看到调试器单击按钮,链接等,则确实可以正常工作。最小化和还原窗口会再次"捕获" UI,用户可以继续工作直到行为恢复。
如果我删除透明边框,则不会发生此行为。我是在做错什么,还是需要执行一些其他设置,代码等才能正确使用透明边框?
这是我的失败代码的窗口声明。
<Window x:Class="MyProject.MainContainer" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF APplication" Height="600" Width="800" xmlns:egc="ControlLibrary" Background="{x:Null}" BorderThickness="0" AllowsTransparency="True" MinHeight="300" MinWidth="400" WindowStyle="None" >
和不表现该行为的代码
<Window x:Class="MyProject.MainContainer" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF Application" Height="600" Width="800" xmlns:egc="ControlLibrary" Background="{x:Null}" BorderThickness="0" AllowsTransparency="False" MinHeight="300" MinWidth="400" WindowStyle="None" >
解决方案
我们是否在Windows XP SP2上使用.NET 3.0或者.NET 3.5?如果是这样,这是透明窗口API的已知问题,该问题已在.NET 3.5和XP的SP3(我认为是Vista的SP1)中已修复。基本上,当我们将AllowsTransparency设置为True时,WPF管道必须以纯软件模式进行渲染。这将导致大多数系统的性能显着下降。
不幸的是,我们只能通过升级到.NET 3.0 SP1(包括在.NET 3.5中)来解决此问题,并安装适用于Windows的Service Pack。请注意,透明窗口的速度仍然较慢,但效果不及后者。我们可以在此处找到更深入的讨论。
我在Windows XP Pro SP3上运行,并使用.NET 3.5 SP1. 我还验证了该项目针对的是框架的3.5版。
我认为我终于找到了解决方法。从我读过的所有内容来看,XP SP3和.NET 3.5 SP1应该不会出现此问题,但是确实如此。
这篇博客文章中的示例演示了如何使用Win32 API函数创建不规则形状的窗口,这就是我正在做的事情。在对主窗口进行重新加工以使用这些技术之后,一切似乎都按预期运行,并且行为已没有退货。
还要注意的是,作者推荐此方法的原因是由于WPF和透明窗口的性能问题。虽然我相信在.NET 3.5 SP1中可能会更好,但是实现起来并不难,应该会表现得更好。