3

Было интересно, есть ли у кого-то хорошее представление о том, как с этим справиться.Многоцелевое приложение WP7.1/WP8 с Windows Phone Toolkit (Panorama/LongListSelector)

В WP7.1 мы можем использовать отличный Windows Phone Toolkit, чтобы включить некоторые полезные элементы управления, такие как LongListSelector и Panorama. Они являются частью сборки Microsoft.Phone.Controls.Toolkit.

В WP8 нам не нужен набор инструментов для этих двух элементов управления, поскольку они являются частью официальной сборки Microsoft.Phone.Controls.

У меня есть многоцелевое приложение, так что у меня есть два проекта телефона, WP71 и WP80, где я связываю файлы в WP80 с файлами в WP71.

Это отлично работает до Я пытаюсь использовать элемент управления Panorama или LongListSelector на странице XAML. В проекте 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, иначе это будет исправление.

Мое обходное решение изначально предназначалось для ссылки на старую WP71 DLL в моем проекте WP80. Но другие сторонние библиотеки связывают с официальной 8.0 SDK DLL (Caliburn, в моем случае), поэтому это вызывает проблемы.

Как я могу решить эту рассол? Единственная идея с моей головы заключалась в том, чтобы прибегнуть к коду, чтобы создать экземпляр элемента управления :(Есть ли лучший способ?

ответ

3

Не используйте ссылку, создавайте отдельный просмотр для каждого.

Другим решением может быть создание элемента управления PanoramaEx в каждом из относительных проектов и наследование от Panorama. Тогда представление будет ссылаться на элемент управления PanoramaEx, и вы все равно можете использовать ссылку для одного представления. Именно в том случае, если оба проекта пользовательского интерфейса имеют такое же пространство имен.

Редактирование: не является панорамой для WP7 в пространстве имен:

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

Я использую мое первоначальное решение для ProgressBar и PerformanceProgressBar, у меня есть в каждом проекте UI ProgressBarEx, то WP7 один наследует от ProgressBar и КР8 один наследует от PerformanceProgressBar, а затем в представлениях я ссылаться ProgressBarEx.

+0

Yah, подход «Ex», вероятно, лучший. Для 'LongListSelector' вам нужно создать новый вид, потому что кажется, что он работает по-другому. В WP7 он по умолчанию использует группы, но не в WP8, поэтому вам нужно изменить свойство. – kamranicus

+0

+1 вот что я сделал в конце. Просто нужно было написать 'public class Panorama: Microsoft.Phone.Controls.Panorama {}' и 'public class PanoramaItem: Microsoft.Phone.Controls.PanoramaItem {}', и это было сделано. –

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> на процессорное время, на основе имени цели (обычно Debug и Release, но в этом примере мы предполагали, была цель WP7).

Для других вещей, связанных с многофункциональным приложением silverlight, вы всегда можете прочитать Maintaining a WP7 and WP8 version of a same Silverlight application.