WPF窗口在RDP上运行时不刷新

本文关键字:运行时 刷新 RDP 窗口 WPF | 更新日期: 2023-09-27 18:17:59

我有一个相当奇怪的问题。我使用INotifyPropertyChanged来控制应用程序的可见性行为。当满足某些条件时,将显示带有更新信息的窗口。为了满足设计准则,我禁用了chrome,并添加了我自己的关闭,移动和隐藏逻辑。一切都很好,除了一个非常烦人的行为。当我在RDP模式下运行程序时,如果我通过将其可见性更改为崩溃来隐藏窗口,那么将RDP会话最小化并恢复它。我的窗口不再刷新以显示最新信息。我已经尝试了所有的东西,包括无效的视觉,更新布局,使用渲染委托。没有什么工作。应用程序正在运行,我可以看到实际数据在调试期间发生变化,但RDP会话拒绝重新绘制它。更奇怪的是,我可以拖动窗口,RDP会话在桌面内重新绘制窗口,但窗口内没有任何变化。就像时间被冻结了。

这是我的窗口的示例:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
    xmlns:tb="http://www.hardcodet.net/taskbar"
    Title="MainWindow" 
    Height="{Binding WinHeight}" 
    Width="{Binding WinWidth}"
    Top="{Binding WinTop}"
    Left="{Binding WinLeft}"
    ShowInTaskbar="False" 
    WindowStyle="None" 
    BorderThickness="0" 
    Background="Transparent" 
    AllowsTransparency="True" 
    Visibility="{Binding DisplayWindow}">

WPF窗口在RDP上运行时不刷新

解决方案最终是我需要设置AllowTransparency="False"。出于某种原因,RDP中的透明性可能会导致刷新问题。我不得不牺牲更漂亮的圆角,但现在窗口会根据需要刷新。

注:在移除透明度之后,你可能会留下一个显示4像素灰色边框的窗口。为了移除边框,只需设置ResizeMode="NoResize"

我以前在一些我用非常简单的UI编写的应用程序中遇到过这种情况。按钮没有正确绘制,边框缺失,列表不刷新,渐变经历颜色步进伪影,它们不会从一种颜色逐渐改变到另一种,等等。

我一直认为这是WPF使用图形硬件渲染的一个问题,而RDP和VM盒子在图形上做了一些有趣的恶作剧。我不确定RemoteDesktop做了什么,就其渲染输出而言,但VM盒通常使用模拟的通用图形控制器,这并不总是产生您所期望的。

在下面的文章中我发现了这个:

在服务器端,RDP使用自己的视频驱动程序来渲染显示输出通过将渲染信息构造成网络数据包使用RDP协议并通过网络将它们发送到客户端。

远程桌面协议- MSDN

这使得它听起来像一个图形驱动程序是用来渲染输出而不是图形芯片组(我想这是有意义的)。