【问题标题】:Sending WPF User Controls over WCF or similar通过 WCF 或类似方式发送 WPF 用户控件
【发布时间】:2010-10-05 17:56:07
【问题描述】:

我正在构建一个 MVVM 样式的应用程序,其中实际视图(用户控件)远程存储,并希望通过 WCF 服务发送到我的主应用程序窗口。我这样做是为了避免每次添加新视图时让用户重新安装应用程序。但是,当我尝试从 WCF 服务返回用户控件时,我收到一条错误消息:

System.Runtime.Serialization.InvalidDataContractException: Type 'System.Windows.Input.TouchDevice' cannot be serialized.

我想知道是否有任何方法可以解决这个问题,或者人们是否以其他方式实现了类似的东西?

谢谢, 奥乔维

【问题讨论】:

标签: wpf wcf serialization user-controls


【解决方案1】:

当您从程序集中加载时,您是从程序集中实例化编译对象,这与反序列化操作有很大不同,反序列化操作是服务调用所发生的。您可以对序列化做的最好的事情是传输可以使用 XamlReader 加载的原始 XAML,但这限制了您可以对控件执行的操作,因为您不能使用任何代码。如果您真的要在服务器上托管控件,最灵活的选择是让您的应用程序下载包含新控件的程序集并动态加载新程序集,或者使用可以在启动之前下载新控件程序集的单独启动器主应用程序(确保您花时间了解安全隐患并保护程序集和下载)。

【讨论】:

  • 你帖子的最后一部分让我很感兴趣。这是多么正确/普遍。我可以看到用户在第一次需要视图时会在后台下载 DLL 的场景。有没有其他人做过类似的事情?我了解安全问题,显然会采取必要的预防措施。
  • Ochowie 这样做非常常见;几乎所有现代软件都可以做到。每个在线 MMORPG 都会这样做。本质上,您需要做的是编写一个引导程序应用程序,该应用程序负责查找和下载程序更新到您的应用程序。一旦引导程序下载了最新的更新(或确信没有更新),它就会启动您的应用程序。
  • 是的,我认为这似乎是我见过的最好的解决方案。
  • 这基本上是 ClickOnce 所做的,但很常见的情况是,您会遇到 ClickOnce 无法完全处理部署应用所需的所有内容的情况,此时您需要自己的更新程序。
【解决方案2】:

您尝试做的事情没有任何意义...控件不是 DTO,它们强烈依赖于它们的运行时环境。在 WPF 中,还有调度程序的问题:即使您可以转移一个控件,您将如何将它重新附加到您的应用程序调度程序?无论如何,WPF 控件不能用DataContractSerializer 序列化,并且没有办法改变它。

但是,您可以做的是在 XAML 中传输视图的表示。这当然是假设您的视图只是 XAML,没有任何代码隐藏。然后,您可以使用 XamlReader 加载视图并在您的 UI 中呈现它们。我不确定是否可行,但我认为这是您的最佳选择。

您还可以在单​​独的程序集中实现您的视图,这样用户就不需要重新安装整个应用程序。他们只需要升级修改后的程序集。

【讨论】:

  • 我猜发送原始 XAML 会起作用。不过,我不确定您对调度程序的意思。我试图做的与基于用户选择的内容动态加载用户控件有何不同,如果引用了视图的程序集,这肯定是可行的?
  • 当您实例化一个控件时,它会自动附加到当前线程调度程序。如果您然后将其发送到另一台机器,应该会发生什么?你将无法使用它。但无论如何你不能序列化它,所以重点是没有意义的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多