通过WCF或类似方式发送WPF用户控件

3

我正在采用MVVM风格构建一个应用程序,其中实际的视图(UserControls)被远程存储,并希望通过WCF服务发送到我的主应用程序窗口。我这样做是为了避免用户每次添加新视图时都要重新安装应用程序。然而,当我尝试从我的WCF服务返回一个用户控件时,我会收到一个错误提示:

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

我想知道是否有其他方法可以解决这个问题,或者是否有人用其他方式实现了类似的功能?

谢谢, Ochowie


如果你正在试图处理新视图创建时的安装问题,我建议你尝试为你的应用程序创建一个单击式部署。这里有一个教程:http://msdn.microsoft.com/zh-cn/library/ms227123(v=VS.80).aspx - Steve Ellinger
2个回答

2

如果你从一个程序集中加载信息,那么你就是在实例化该程序集中的编译对象,这与服务调用中所发生的反序列化操作完全不同。使用序列化的最佳方法是传输可由XamlReader加载的原始XAML,但这会限制控件的使用,因为你不能使用任何代码。如果你真的想在服务器上托管控件,最灵活的选项是让你的应用程序下载包含新控件的程序集,并动态加载新的程序集或使用一个单独的启动器,在启动主应用程序之前下载新的控件程序集(确保花时间理解安全性问题并保护程序集和下载)。


你帖子的最后一部分引起了我的兴趣。这种做法有多正确/常见?我可以想象出这样的场景:当用户第一次需要查看时,他会在后台下载DLL。还有其他人做过类似的事情吗?我理解安全方面的担忧,并且显然会采取必要的预防措施。 - Ochowie
这在Ochowie中非常普遍;几乎所有现代软件都这样做。每个在线MMORPG都这样做。基本上,你需要编写一个引导程序应用程序,负责查找和下载应用程序的程序更新。一旦引导程序下载了最新的更新(或确保没有更新),它就会启动你的应用程序。 - Chris Holmes
是的,我认为这似乎是我见过的最好的解决方案。 - Ochowie
这基本上就是ClickOnce的作用,但很常见的情况是在使用ClickOnce时会遇到一些无法完全处理应用程序所需部署的情况,此时你就需要自己的更新程序。 - John Bowen

0

你试图做的事情并没有太多意义...控件不是DTO,它们强烈依赖于运行时环境。在WPF中,还存在调度程序的问题:即使你可以传输控件,你如何将其重新附加到应用程序调度程序上?无论如何,WPF控件不能使用进行序列化,也没有改变这种情况的方法。

然而,你可以传输XAML视图的表示。当然,这是假设你的视图仅限于XAML,没有任何代码后台。然后,你可以使用加载视图并在UI中呈现它们。我不确定可行性,但我认为这是你最好的选择。

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


我猜发送原始XAML应该是可行的。但我不确定你所说的调度程序是什么意思。如果视图的程序集被引用,根据用户选择动态加载用户控件显然是可以实现的,那么我正在尝试做的有什么不同呢? - Ochowie
当您实例化一个控件时,它会自动附加到当前线程调度程序。如果您将其发送到另一台机器上,应该会发生什么?您将无法使用它。但是无论如何,您都无法序列化它,因此这个问题就没了... - Thomas Levesque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接