3

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

在 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。但是其他 3rd 方库绑定了官方 8.0 SDK DLL(在我的例子中是 Caliburn),所以它会导致问题。

我该如何解决这个泡菜?我脑海中唯一的想法是诉诸代码隐藏来创建控件的实例:(有更好的方法吗?

4

2 回答 2

3

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

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

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

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

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

于 2013-04-07T00:59:10.323 回答
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”中。我们只是<phone:PhoneApplicationPage>在处理器时根据目标名称(通常是DebugRelease,但在本例中我们假设有一个目标WP7)将其封装。

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

于 2014-06-25T11:03:36.633 回答