为Silverlight 3.0应用程序创建WPF前端

时间:2009-05-14 14:28:35

标签: wpf silverlight wcf-ria-services

我正在考虑为Silverlight应用程序创建WPF前端。由于Silverlight通常具有较小的功能子集,因此这应该是可能的,但我不确定解决问题的最佳方法。从一开始,让我说我目前正在使用浏览器运行该应用程序,但它缺乏捕获我想添加的系统范围的按键功能,以及一些W7集成。

我以前在Silverlight和WPF之间共享源代码,为每个项目创建一个项目,然后使用“添加为链接”链接两者之间的源文件。这一次,我可能会使用.NET RIA Services在平台之间共享源和业务逻辑。

我看到的问题是在项目之间共享Xaml。除了命名空间之外,它几乎兼容复制和粘贴,但这不是分享资源的好方法。有没有人想出一个很好的方法来分享Silverlight和WPF之间的Xaml?

我想到的最后一个选项是让WPF应用程序使用Browser控件来托管Silverlight应用程序。然后我可以添加Windows特定功能。对我而言,这似乎是从开发和测试角度出发的最简洁方法。每个人都在想什么?

3 个答案:

答案 0 :(得分:4)

这是你可以使用的技巧。

  1. 确保您的Silverlight视图和视图模型在自己的程序集中是隔离的,WPF应用程序可以轻松引用它们。
  2. 添加对包含Views&amp ;;的Silverlight类库的引用。在WPF应用程序中查看模型。
  3. 将UserControl的内容“CustomerView”移动到一个名为“customerViewTemplate”的资源词典中的DataTemplate

  4. 在Silver UI和WPF中的根UI元素XAML文件中执行以下操作:

  5. <ContentControl ContentTemplate="{Staticresource customerViewTemplate}" />

    1. 在Silverlight应用程序的App.xaml中,请确保将以下资源字典引用添加到合并的字典中。
    2. <ResourceDictionary Source="MyApp.Views;component/CustomerViewResources.xaml" />

      1. 在WPF应用程序的App.xaml中,请确保将以下资源字典引用添加到合并的字典中。
      2. <ResourceDictionary Source="pack://application:,,,/MyApp.Views;component/CustomerViewResources.xaml" />

        对于编号很抱歉,看起来Stack Overflow的有序列表机制有点不对。

        这之所以有效,是因为您无法在WPF中直接从XAML引用Silverlight UserControl。它会给你以下错误:

          

        '无法解析对程序集的依赖性   'System.Windows,版本= 2.0.5.0,   文化=中性,   公钥= 7cec85d7bea7798e”   因为它还没有预装。   使用ReflectionOnly API时,   依赖程序集必须是   通过预先加载或按需加载   ReflectionOnlyAssemblyResolve   事件

        如果您尝试使用C#强制UserControl进入WPF网格,您将收到以下3个错误:

          

        最佳重载方法匹配   'System.Windows.Controls.UIElementCollection.Add(System.Windows.UIElement)'有一些无效的参数。

             

        类型   'System.Windows.Controls.UserControl'   在一个不是的程序集中定义   引用。您必须添加引用   组装'System.Windows,   版本= 2.0.5.0,文化=中立,   公钥= 7cec85d7bea7798e'

             

        无法转换   'ToWpfTest.Views.TestView'来   'System.Windows.UIElement'

        我收集这是因为WPF中的System.Windows.UIElement与Silverlight中的System.Windows.UIElement不同。

答案 1 :(得分:1)

根据我的经验,XBAP应用程序对标签和按键问题没有任何问题。如果您要找到解决方案,那么如果您要找到将它们添加到Silverlight应用程序中,请坚持使用它。

您正在考虑哪些具体的W7集成?

我也使用添加链接概念,以便找到可管理性的正确方法。

我看到的问题是在项目之间共享Xaml。除了命名空间之外,它几乎兼容复制和粘贴,但这不是分享资源的好方法。有没有人想出一个很好的方法来分享Silverlight和WPF之间的Xaml?

我有一个XBAP和WPF我有2个项目这些项目都有两个加载器代码。(没有复制粘贴期望单个更改类(Window和Page),这意味着2个项目有类似的代码。

你可以像你提到的那样创建一个加载器,没有任何伤害......

如果您的要求与安全问题等相匹配,您本可以首先选择XBAP ......

或尝试

  1. patterns & practices: Composite WPF and Silverlight
  2. Prism

答案 2 :(得分:-1)

共享XAML的问题在于Silverlight和WPF使用非常不同的模型来处理动画和状态更改。我想在大多数项目中,专门用于动画的XAML数量会相当显着,所以我不认为将XAML作为一个非常可行的选择。