多目标WP7.1/WP8应用程序与Windows Phone工具包(全景/ LongListSelector)



我想知道是否有人有一个好主意如何处理这个问题。

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

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

我有多目标我的应用程序,这样我就有两个电话项目,WP71和WP80,我在WP80中的文件链接到WP71中的文件。

这工作得很好,直到我尝试在XAML页面中使用全景或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,在我的情况下),所以它会引起问题。

我该如何解决这个难题?我脑海中唯一的想法是求助于代码隐藏来创建控件的实例:(有没有更好的方法?)

不要使用链接,为每个链接创建一个单独的视图

另一个解决方案可能是在每个相关项目中创建一个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

可能不是最优雅的解决方案,但您可以尝试使用T4文件。

<#@ 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. example "中。我们只是在处理器时根据目标名称(通常是DebugRelease)将其封装在<phone:PhoneApplicationPage>中,但在本例中,我们假设存在一个目标WP7)。

关于多目标silverlight应用程序的其他相关内容,您可以随时阅读维护同一个silverlight应用程序的WP7和WP8版本

最新更新