3

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

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

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

我想到的最后一个选项是让 WPF 应用程序使用浏览器控件来托管 Silverlight 应用程序。然后我可以围绕它添加 Windows 特定的功能。对我来说,从开发和测试的角度来看,这似乎是最干净的方式。大家怎么看?

4

3 回答 3

4

这是您可以使用的技巧。

  1. 确保您的 Silverlight 视图和视图模型在它们自己的程序集中被隔离,您的 WPF 应用程序可以轻松引用这些程序集。
  2. 添加对 Silverlight 类库的引用,该类库包含 WPF 应用程序中的视图和视图模型。
  3. 将 UserControl 的内容“CustomerView”移动到位于名为“customerViewTemplate”的资源字典中的 DataTemplate

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

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

  1. 在 Silverlight 应用程序的 App.xaml 中,确保将以下资源字典引用添加到合并字典。

<ResourceDictionary Source="MyApp.Views;component/CustomerViewResources.xaml" />

  1. 在 WPF 应用程序的 App.xaml 中,确保将以下资源字典引用添加到合并字典中。

<ResourceDictionary Source="pack://application:,,,/MyApp.Views;component/CustomerViewResources.xaml" />

对不起编号,看起来 Stack Overflow 的有序列表机制有点不对劲。

之所以可行,是因为您不能直接从 WPF 中的 XAML 引用 Silverlight UserControl。它会给你以下错误:

'无法解析对程序集 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' 的依赖,因为它没有被预加载。使用 ReflectionOnly API 时,必须通过 ReflectionOnlyAssemblyResolve 事件预加载或按需加载依赖程序集。

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

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

'System.Windows.Controls.UserControl' 类型在未引用的程序集中定义。您必须添加对程序集 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' 的引用

无法从“ToWpfTest.Views.TestView”转换为“System.Windows.UIElement”

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

于 2009-05-18T16:27:07.103 回答
1

就我的经验而言,XBAP 应用程序在选项卡和按键问题方面没有问题。如果您想找到某种方式将它们添加到您的 silverlight 应用程序中,如果您找到解决方案,请坚持使用它。

你在看什么具体的 W7 集成?

我也使用添加链接概念,以便以正确的方式实现可管理性。

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

我有一个 XBAP 和 WPF 我有 2 个项目,这些项目具有两者的加载器代码。(对于类(窗口和页面)的单个更改没有复制粘贴期望,这意味着 2 个项目具有相似的代码。

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

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

或者试试

  1. 模式和实践:复合 WPF 和 Silverlight
  2. 棱镜
于 2009-05-18T14:03:19.123 回答
-1

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

于 2009-05-14T16:36:03.373 回答