Каковы основные моменты трения при переходе от WPF к Silverlight и как вы заполняете пробелы в функциональности?

Хорошо, чтобы дать небольшой опыт, я изучил WPF около 3 лет назад и постоянно рассуждал о том, что произошло с тех пор, как в разных версиях. Я посмотрел (и реализовал) MVVM на пару проектов, хорошо посмотрел на фреймворки, такие как Prism, поэтому я думаю, что я довольно хорошо разбираюсь в большинстве областей фреймворка. Я также кратко рассказал о нескольких небольших проектах Silverlight 2.0.

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

Например, я знаю, что DataTriggers отсутствуют как есть MultiBindings и целый массив других вещей. То, что меня интересует в чтении, - это не различия, а как то, что вы получаете из этих различий или какие другие шаблоны полезны в Silverlight. Что, если мне нужен a DataTrigger? ясно, что мой дизайн должен учитывать эти вещи.

Итак, вопрос в том, что.. если вы прошли этот переход, какие различия вызвали у вас наибольшую проблему и как вы обходились?

Ответ 1

Во-первых, в то время как это датируется Silverlight 3, в этом документе подробно описываются различия между WPF и Silverlight:

Microsoft WPF-Silverlight Diffferences White Paper http://wpfslguidance.codeplex.com/releases/view/30311

Это отличный первый шаг, чтобы ознакомиться с различиями.

Вы также можете взглянуть на проект Prism. Одна из целей этого проекта - создать набор функциональных возможностей взаимодействия между Silverlight и WPF, чтобы вы могли по существу создавать корпоративные приложения, ориентированные на обе платформы, и повторно использовать большую часть кода. Знакомство с проектом поможет также выявить различия:

http://compositewpf.codeplex.com/

Наконец, в то время как Silverlight может не иметь триггеров данных, вы можете использовать комбинацию таких функций, как поведение и триггеры:

http://www.silverlightshow.net/items/Behaviors-and-Triggers-in-Silverlight-3.aspx

И диспетчер визуальных состояний (VSM):

http://timheuer.com/blog/archive/2008/06/04/silverlight-introduces-visual-state-manager-vsm.aspx

Чтобы выполнить большую часть того, что вам нужно.

Ответ 2

Предоставление порта Silverlight как такового для нашего приложения WPF, следующие две "болевые" точки, с которыми мы столкнулись.

  • Разделение и группировка XAML/модулей для повышения производительности и по требованию XAP-загрузки с использованием MEF.
  • Задача достижения бинарной совместимости с использованием той же базы кода для WPF/Silverlight.
  • Для некоторых наших функций требуется OOB и принятие пользователем.
  • Мы оптимизировали немного функциональности, полагаясь на IsolStorage.

Надеюсь, что это поможет.

[Теперь, когда Silverlight 4.0 имеет стабильную сборку, у нас было несколько иконов Visual Studio за последние несколько выпусков, которые разрешили себя сверхурочно. (Мы придерживались Silverlight 3.0, а где-то в середине марта прыгали на бета-версию SL 4.0 и финальную версию)].

N.B.: Я попытался сохранить абстрактную картину, чтобы не выявить личность клиента.

Ответ 3

  • MarkupExtension
  • IMultiValueConverter
  • Template.Triggers
  • Style.Triggers
  • Связывание RelativeSource = {RelativeSource AncestorType...
  • Binding.IsAsync
  • {x: Static...
  • {DynamicResource...
  • Grid.IsSharedSizeScope/SharedSizeGroup

Все они не поддерживаются в Silverlight, и вы должны обходить их. Каждый случай нуждается в собственном суждении о том, как "заполнить пробелы"

Для части триггеров единственным решением является использование VisualStateManger. Следующая статья дает хороший пример того, как сделать переход от триггеров к VSM: http://blogs.msdn.com/b/wpfsdk/archive/2009/02/27/the-visualstatemanager-and-triggers.aspx


Далее, OnApplyTemplate запускается в другом порядке, что может повлиять на любые настраиваемые элементы управления или UserControls, которые вы, возможно, создали.

WPF:

  • Конструктор UserControl
  • Конструктор MyControl
  • MyControl.OnApplyTemplate
  • UserControl Loaded
  • Загрузка MyControl

Silverlight:

  • Конструктор UserControl
  • Конструктор MyControl
  • Загрузка MyControl
  • UserControl Loaded
  • MyControl.OnApplyTemplate

И, конечно, у Microsoft есть статья об этом, называемая "совместимость WPF", и дает более подробный обзор различий и изменений между WPF и Silverlight:

http://msdn.microsoft.com/en-us/library/cc903925(VS.95).aspx

Надеюсь, что это поможет

Ответ 4

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

Например, селектора шаблонов данных отсутствуют - я обнаружил, что это довольно шок.