使用Windows Phone Toolkit的多目标WP7.1 / WP8应用程序(Panorama / LongListSelector)

时间:2013-04-07 00:33:58

标签: windows-phone-7 xaml windows-phone-8 windows-phone silverlight-toolkit

想知道是否有人知道如何处理这个问题。

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

在WP8中,我们不需要这两个控件的工具包,因为它们是官方Microsoft.Phone.Controls程序集的一部分。

我有多个目标我的应用程序,所以我有两个电话项目,WP71和WP80,我将WP80中的文件链接到WP71中的文件。

这非常有用直到我尝试在XAML页面中使用Panorama或LongListSelector控件。在WP80项目中,如果我引用手机工具包的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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的内部内容位于“Page.xaml”中。我们只是在处理器时间根据目标名称(通常是调试发布)将其封装在<phone:PhoneApplicationPage>中,但在此示例中我们假设存在目标<强> WP7 )。

对于与多目标silverlight应用相关的其他内容,您可以随时阅读Maintaining a WP7 and WP8 version of a same Silverlight application