使用Windows Phone Toolkit(全景/长列表选择器)创建适用于多个WP7.1/WP8目标的应用程序。

3

想知道有没有好的方法来处理这个问题。

在WP7.1中,我们可以利用优秀的Windows Phone Toolkit包含一些有用的控件,如LongListSelector和Panorama。它们是Microsoft.Phone.Controls.Toolkit程序集的一部分。

在WP8中,我们不需要toolkit来使用那两个控件,因为它们已经是官方的Microsoft.Phone.Controls程序集的一部分了。

我将我的应用设计成多目标,因此我有两个手机项目,WP71和WP80,在WP80中我将文件链接到WP71中的文件。

这很好地工作,直到我尝试在XAML页面中使用Panorama或LongListSelector控件。在WP80项目中,如果我引用手机toolkit的WP80 DLL,则它不包括上述两个控件,因为它们已经存在。

问题是,WP71需要在XAML顶部声明命名空间,而对于两个项目,命名空间是不同的。

WP71:

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

<toolkit:Panorama />

WP80:

xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"

<phone:Panorama />

因为每个项目需要指向不同的程序集,如果我只使用一个命名空间,那么我无法构建这些项目,因为每个项目都认为命名空间不正确。

我认为我不能在我的XAML中使用编译常量,否则那将是一种解决方法。

我的解决方法最初是在我的WP80项目中引用旧的WP71 DLL。但其他第三方库绑定到官方的8.0 SDK DLL(如我的Caliburn),所以会出现问题。

我该如何解决这个问题?我脑海中唯一的想法是通过代码后台创建控件的实例:( 是否有更好的方法?

2个回答

3
不要使用链接,为每个创建单独的视图。
另一个解决方案可能是在相关项目中为每个创建一个PanoramaEx控件,并从Panorama继承。然后,视图将引用PanoramaEx控件,您仍然可以使用单个视图的链接。这是如果两个UI项目具有相同的命名空间。
编辑:WP7的全景是否处于命名空间中:
 xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"

我使用初始解决方案来处理 ProgressBar 和 PerformanceProgressBar,每个 UI 项目中都有一个 ProgressBarEx,WP7 中继承自 ProgressBar,而 WP8 中则继承自 PerformanceProgressBar,在视图中引用 ProgressBarEx


是的,Ex方法可能更好。对于LongListSelector,您需要创建一个新视图,因为它似乎工作方式不同。在WP7中,默认使用分组,但在WP8中不是这样,因此您必须更改属性。 - kamranicus
+1 最终我就是这么做的。只需要写 public class Panorama : Microsoft.Phone.Controls.Panorama {}public class PanoramaItem : Microsoft.Phone.Controls.PanoramaItem {} 就可以了。 - Cœur

0

这可能不是最优雅的解决方案,但您可以尝试使用 T4 文件 (.tt 文件) 生成两个目标。

<#@ template language="C#" hostspecific="true"#>
<#@ output extension=".xaml"#>
<#@ assembly name="EnvDTE" #>
<phone:PhoneApplicationPage
    x:Class="PhoneAppDemo.Pages.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
<# IServiceProvider serviceProvider = (IServiceProvider)Host;
   EnvDTE.DTE dte = (EnvDTE.DTE)serviceProvider.GetService(typeof(EnvDTE.DTE));
   var configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name;
   if (configName == "WP7") { #>
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
<# }else{ #>
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
<# } #>
    >
<# include file="Page.xaml" #>
</phone:PhoneApplicationPage>

在这个例子中,页面的内部内容在 "Page.xaml" 中。我们只是在处理器时间根据目标名称(通常为 DebugRelease,但在这个例子中我们假设有一个目标 WP7)将其封装在 <phone:PhoneApplicationPage> 中。
对于与多目标 Silverlight 应用程序相关的其他内容,您可以阅读 维护同一 Silverlight 应用程序的 WP7 和 WP8 版本

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