WPF 中的远程桌面连接 (RDP) 后重新加载视图

sad*_*ori 3 c# wpf mvvm

在 WPF MVVM 应用程序中,在远程桌面连接到应用程序正在运行的电脑后,用户控件会重新加载,之后我们遇到了一些问题。我阅读了有关 WPF 的链接,但无法解决此问题。

有一个ItemsControlsUserControl添加到:

<ItemsControl ItemsSource="{Binding CamerasList}" x:Name="AllCamerasControl">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:SingleView />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

其构造函数UserControl如下:

public SingleCameraView()
{ 
    InitializeComponent();
    DataContext = new SingleViewModel();
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何解决这个问题?

小智 5

在其他地方,有人指出,处理连接到运行 WPF 应用程序的系统时发生的卸载/加载两步的方法,并且为了避免出现问题,您应该防止在“已加载”中重新输入初始化代码处理程序,所以我在这里不讨论这个主题。

我最近发现,当发生这种情况时,控件在很大程度上会保留其 DataContract 值。

也就是说,我最近发现了一个关于 ItemsControl 的问题。

看起来,作为布局/渲染/重新加载过程的一部分,ItemsControl 被完全重新评估,并且当发生这种情况时,模板化元素将被完全重新创建和重新绑定。

对于上面的示例来说,这意味着作为卸载/加载处理的一部分,现有的 UniformGrid 将被删除并取消分配其 DataContract,并且创建一个全新的实例,并分配 DataContract。

接下来,“CamerasList”被反弹到 ItemsSource,并且重复的 ItemTemplate 应用于列表中的每个项目。

从您提供的样本中我不知道这对您来说是否是一个特别的问题。如果您遵循 MVVM 模式,这通常会自行解决,但如果视图中有任何代码隐藏,则它可能无法正确解释被换出和替换。