首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多目标WP7.1/WP8应用程序与Windows工具包(Panorama / LongListSelector)

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

Stack Overflow用户
提问于 2013-04-07 00:33:57
回答 2查看 1.1K关注 0票数 3

想知道是否有人对如何处理这件事有个好主意。

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

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

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

这是很好的,直到我尝试在XAML页面中使用Panorama或LongListSelector控件。在WP80项目中,如果我引用电话工具包的WP80 DLL,它不包括前面提到的两个控件,因为奇怪的是,它们已经存在。

问题是,WP71需要XAML顶部的名称空间声明,而且两个项目的名称空间都不同。

WP71

代码语言:javascript
复制
xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

<toolkit:Panorama />

WP80

代码语言:javascript
复制
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"

<phone:Panorama />

我不能构建项目,因为每个项目都认为名称空间是不正确的,如果我只是使用一个,因为它们需要指向不同的程序集。

我不认为我可以在我的XAML中使用编译常量,否则这将是一个修复。

我的解决方法最初是在我的WP71项目中引用旧的WP80 DLL。但是其他第三方库绑定到官方的8.0SDKDLL(在我的例子中是杯本),因此它会导致问题。

我怎么解决这个泡菜?我脑子里唯一的想法就是利用代码隐藏来创建控件的实例:(有更好的方法吗?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-07 00:59:10

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

另一种解决方案可能是在每个相关项目中创建一个PanoramaEx控件,并从Panorama继承。然后视图将引用PanoramaEx控件,您仍然可以使用指向单个视图的链接。这是如果两个UI项目都有相同的命名空间的话。

编辑:名称空间中的WP7不是全景图:

代码语言:javascript
复制
 xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"

对于ProgressBar和PerformanceProgressBar,我确实使用了我的初始解决方案,我在每个UI项目中都有一个ProgressBarEx,WP7继承了ProgressBar,WP8继承了PerformanceProgressBar,然后在视图中引用了ProgressBarEx

票数 3
EN

Stack Overflow用户

发布于 2014-06-25 11:03:36

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

代码语言:javascript
复制
<#@ 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“中。我们只是在处理器时将它封装在<phone:PhoneApplicationPage>中,基于目标名称(通常是DebugRelease,但在本例中我们假设有一个目标WP7)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15857571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档