想知道是否有人知道如何处理这个问题。
在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),因此会导致问题。
我该如何解决这个泡菜?我头脑中唯一的想法是使用代码隐藏来创建控件的实例:(有更好的方法吗?
答案 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。