我正在构建MVVM风格的应用程序,其中实际视图(UserControls)被远程存储,并希望通过WCF服务发送到我的主应用程序窗口。我这样做是为了避免每次添加新视图时让用户重新安装应用程序。但是,当我尝试从我的WCF服务返回用户控件时,我收到一条错误说明:
System.Runtime.Serialization.InvalidDataContractException: Type 'System.Windows.Input.TouchDevice' cannot be serialized.
我想知道是否有任何解决方法,或者人们是否已经以其他方式实施了类似的东西?
谢谢, Ochowie
答案 0 :(得分:2)
当您从程序集加载时,您正在从程序集中实例化编译对象,这与反序列化操作有很大不同,后者就是服务调用所发生的情况。使用序列化可以做的最好的事情是传输可以使用XamlReader加载的原始XAML,但这限制了您可以使用控件执行的操作,因为您无法使用任何代码。如果您真的设置了服务器上的托管控件,最灵活的选择是让您的应用程序下载包含新控件的程序集并动态加载新程序集或使用可以在启动之前下载新控件程序集的单独启动程序主要应用程序(确保您花时间了解安全隐患并确保程序集和下载安全)。
答案 1 :(得分:0)
你要做的事情并没有多大意义......控件不是DTO,它们强烈依赖于运行时环境。在WPF中,还存在调度程序的问题:即使您可以传输控件,如何将其重新连接到应用程序调度程序?无论如何,WPF控件不能与DataContractSerializer
序列化,并且无法改变它。
但是,您可以做的是在XAML中传输视图的表示。这当然是假设您的视图只是XAML,没有任何代码隐藏。然后,您可以使用XamlReader
加载视图并在UI中呈现它们。我不确定可行性,但我认为这是你最好的选择。
您还可以在单独的程序集中实现视图,以便用户无需重新安装整个应用程序。他们只需升级修改后的程序集。