Создание внешнего интерфейса WPF для приложения Silverlight 3.0 - PullRequest
3 голосов
/ 14 мая 2009

Я рассматриваю возможность создания внешнего интерфейса WPF для приложения Silverlight. Поскольку Silverlight обычно имеет меньший набор функций, это должно быть возможно, но я не уверен, что это лучший способ решить проблему. С самого начала позвольте мне сказать, что в настоящее время я запускаю приложение из браузера, но в нем отсутствуют такие функции, как захват системных клавиш, которые я хотел бы добавить, а также некоторая интеграция с W7.

Ранее я делился источником между Silverlight и WPF, создавая проект для каждого, а затем используя «добавить как ссылку», чтобы связать исходные файлы между ними. В этот раз я, вероятно, буду использовать .NET RIA Services для обмена исходной и бизнес-логикой между платформами.

Проблема, которую я вижу, - это совместное использование Xaml между проектами. Он в значительной степени совместим с копированием и вставкой, за исключением пространств имен, но это не лучший способ для совместного использования ресурсов. Кто-нибудь придумал хороший способ поделиться Xaml между Silverlight и WPF?

Последний вариант, который приходил мне в голову, состоял в том, чтобы приложение WPF использовало элемент управления Browser для размещения приложения Silverlight. Тогда я могу добавить специфические особенности Windows вокруг этого. Мне кажется, это самый чистый путь с точки зрения разработки и тестирования. Что все думают?

Ответы [ 3 ]

4 голосов
/ 18 мая 2009

Вот трюк, который вы могли бы использовать.

  1. Убедитесь, что ваши представления Silverlight и модели представлений изолированы в их собственной сборке, на которую легко ссылаться ваше приложение WPF.
  2. Добавьте ссылку на библиотеку классов Silverlight, в которой хранятся модели представлений и представлений в приложении WPF.
  3. Переместите содержимое UserControl, "CustomerView" в DataTemplate, размещенный в словаре ресурсов под названием "customerViewTemplate"

  4. Внутри файлов XAML корневого элемента пользовательского интерфейса в Silverlight и WPF сделайте следующее:

<ContentControl ContentTemplate="{Staticresource customerViewTemplate}" />

  1. В файле App.xaml приложения Silverlight обязательно добавьте следующую ссылку на словарь ресурсов в объединенные словари.

<ResourceDictionary Source="MyApp.Views;component/CustomerViewResources.xaml" />

  1. В файле App.xaml приложения WPF обязательно добавьте следующую ссылку на словарь ресурсов в объединенные словари.

<ResourceDictionary Source="pack://application:,,,/MyApp.Views;component/CustomerViewResources.xaml" />

Извините за нумерацию, похоже, механизм упорядоченного списка Stack Overflow немного не работает.

Причина, по которой это работает, заключается в том, что вы не можете напрямую ссылаться на Silverlight UserControl из XAML в WPF. Это даст вам следующую ошибку:

'Невозможно разрешить зависимость от сборки 'System.Windows, версия = 2.0.5.0, Culture = нейтрально, PublicKeyToken = 7cec85d7bea7798e» потому что он не был предварительно загружен. При использовании API ReflectionOnly зависимые сборки должны быть предварительно загружен или загружен по требованию через ReflectionOnlyAssemblyResolve событие.

Если вы попытаетесь принудительно настроить UserControl на WPF Grid с помощью C #, вы получите следующие 3 ошибки:

Лучший перегруженный метод соответствует «System.Windows.Controls.UIElementCollection.Add (System.Windows.UIElement)» содержит недопустимые аргументы.

тип 'System.Windows.Controls.UserControl' определяется в сборке, которая не ссылки. Вы должны добавить ссылку сборке 'System.Windows, Версия = 2.0.5.0, Культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e '

не может конвертировать из ToWpfTest.Views.TestView для 'System.Windows.UIElement'

Я понимаю, это потому, что System.Windows.UIElement в WPF отличается от System.Windows.UIElement в Silverlight.

1 голос
/ 18 мая 2009

XBAP-приложения не имеют проблем с вкладками и нажатиями клавиш, насколько мне известно. Если вы найдете способ добавить их в приложение Silverlight, оставайтесь с ним, если найдете решение.

На какую конкретную интеграцию W7 вы смотрите?

Я также использую концепцию добавления ссылок, чтобы обеспечить правильный способ управления.

Проблема, которую я вижу, - это совместное использование Xaml между проектами. Он в значительной степени совместим с копированием и вставкой, за исключением пространств имен, но это не лучший способ для совместного использования ресурсов. Кто-нибудь придумал хороший способ поделиться Xaml между Silverlight и WPF?

У меня есть XBAP и WPF. У меня есть 2 проекта, у этих проектов есть код загрузчика для обоих (нет ожидаемого копирования при вставке для одного изменения класса (Window и Page), что означает, что у проекта 2 одинаковый код. *

Вы могли бы создать загрузчик, как вы упомянули, там никакого вреда ...

Вы могли бы в первую очередь пойти на XBAP, если бы ваши требования соответствовали требованиям безопасности и т. Д. *

Или попробуйте

  1. шаблоны и практики: составной WPF и Silverlight
  2. Призма
0 голосов
/ 14 мая 2009

Проблема с совместным использованием XAML заключается в том, что Silverlight и WPF используют очень разные модели для обработки анимаций и изменений состояния. Я полагаю, что объем XAML, выделенный для анимации, будет значительным в большинстве проектов, поэтому я не считаю совместное использование XAML очень приемлемым вариантом.

...