Подтвердить что ты не робот

Какие функции .Net/WPF вы пропустите при работе в Silverlight?

Недавно я начал работать с Silverlight и сразу заметил разницу между Silverlight BCL и полным .Net и WPF. Для некоторых из них я нашел отличные решения, размещенные в Интернете другими разработчиками, а другие были более сложными. Какие функции/классы вы были удивлены/разочарованы, чтобы найти отсутствующие в библиотеках классов Silverlight и что вы сделали, чтобы обойти их?

Некоторые из моих были:

  • Нет анимации с событием. Я создал вспомогательный класс со статическими методами для привязки каждого типа анимации, который я использовал для раскадровки в общей библиотеке, и на уровне приложения создаю классы со статическими методы, чтобы собрать их все вместе, как и в XAML, если вы работаете в WPF. До сих пор это было хорошим решением для сохранения моих анимаций и логики из обработчиков событий.
  • ScrollViewer не поддерживает колесико мыши. Adam Cooper создал отличную библиотеку классов, которая добавляет эту функциональность, которая требует минимального кода для реализации в любом проекте Silverlight. На данный момент его сайт, похоже, не работает, поэтому здесь есть ссылка на блог Тима Хейера, который объясняет и связывает его (так что он будет доступен, когда его сайт снова будет в сети). Добавить поддержку колесика мыши для ScrollViewer в Silverlight
  • SortedDictionary<T, K> отсутствует. Я нашел этот пост, который содержит реализацию, но я не закончил используя его сам.
  • ResourceDictionary.MergedDictionaries не доступен. Еще раз... нашел того, кто это сделал и разместил исходный код, но это было немного сложно. Я, вероятно, немного поработаю над этим, но еще не сделал этого. MergedDictionaries в Silverlight
  • Вложенное свойство ZIndex доступно только на объекте Canvas. Я разместил это как вопрос здесь на SO, и кто-то сделал большое предложение по упаковке моих контейнеров в коллекцию, если это необходимо. Он чувствует себя немного небрежным, но вы должны делать то, что должны делать. Мои контейнеры вложены в три уровня глубины, поэтому мне может понадобиться деформировать их все в Canvas-объектах и ​​установить Canvas.ZIndex три раза для каждого события. Уродливо, как грех, но если это единственный способ, то пусть будет так.

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

4b9b3361

Ответ 1

С чего начать?:)

  • Нет MultiBinding
  • Нет ElementName= привязка
  • TemplateBinding может ссылаться только на прямые свойства, а не на DP
  • Нет Связи RelativeSource
  • Нет привязки к дочерним свойствам - например, {Binding Path=Foo.Bar[0].Baz}
  • Невозможно подписаться на измененные события на любое произвольное свойство зависимостей - автор класса должен явно определить событие (и в большинстве случаев на самом деле выполняются только одно или два свойства в элементах управления SL)
  • Менеджер визуальных состояний требует, чтобы автор управления знал все состояния, соответствующие стилю, когда элемент управления написан, что полностью разрушает историю "расширение через стили/шаблоны, а не наследование", которые WPF рекламирует
  • Без рекламы
  • Нет навигации
  • Наследование свойств зависимостей
  • Нет/поддержка sucky для внешних ресурсов. Словари/объединенные словари.
  • История проверки отстой (она немного улучшена в WPF)
  • Печать
  • <Setter .. Value="{Binding ...}" /> не поддерживается

Кроме того, ряд сигнатур методов изменился без уважительной причины. Например, IIRC, перегрузки для Dispatcher.Invoke различны, вместо SL просто игнорируют параметры, которые он еще не может обрабатывать. Или, как еще один пример, ObservableCollection в WPF может поднимать события добавления, удаления, замены и перемещения - в SL это только первые три.

Так как я пишу код для работы на обеих платформах, код заканчивается тем, что он усеян в шаблонах стратегий и #ifdefs. Чувствует себя как С++ снова: -)

Ответ 2

В дополнение к Пол Стовелл отличный список:

  • Нет пользовательских расширений разметки.
  • Расширение разметки x:Type <<20 > .
  • Нет LayoutTransform (хотя существуют обходные пути).
  • Нет метаданных удобства для DependencyProperties (необходимо вручную определить меру/аранжировать/отображать недействительность, изменения свойств и т.д.).
  • Нет классов легкого класса Drawing или DrawingContext (необходимо использовать элементы Shape).
  • Нет команд.

Ответ 3

Никакая поддержка сокетов или UDP, вероятно, не самая большая боль для меня, за которой следуют отсутствующие криптографические классы.

Кроме того, недостающие классифицированные как StringDictionary и ApplicationException, к которым вы привыкли, а затем находите, не являются причиной боли. Как правило, можно найти замену или обходной путь, но лично я предпочел бы, чтобы загрузка Silverlight проходила с 5 МБ до 6 МБ, поэтому нам не пришлось; -).

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

Ответ 4

Как дизайнер, отсутствие триггеров Event/Property настолько бессильно.

Я не парень С#/oop, поэтому, когда мне приходится запускать цепочку раскадровки, когда элемент загружается или нажимается кнопка, или после завершения другого раскадровки, я должен вызвать devs в: (

Ответ 5

По-видимому, комментируя felixthehat, комментарий требовал определенной репутации.

Но я бы хотел повторить его вызов для триггеров Event/Property... Рамка триггеров в WPF позволяет мне делать действительно мощные вещи в качестве дизайнера взаимодействия без необходимости погружаться в код. Я скучаю по нему.

Ответ 6

Вот некоторые вещи, с которыми я столкнулся, когда я преобразовал приложение WPF в Silverlight:

  • Класс enum отличается... Невозможно сделать это в Silverlight (может в WPF) для привязки к Enum:

    HoleType1.ItemsSource = Enum.GetValues ​​(typeof (Hole.HoleTypes));

  • Цвет кистей работает по-другому...

WPF:

  protected Brush _CurrentHoleColor = Brushes.Red;

Silverlight:

  protected Brush _CurrentHoleColor = new SolidColorBrush(Colors.Red);

3. Еще не сработал этот, но что-то по-другому в этом WPF-коде, которое я использовал, чтобы проверить, где была нажата мышь:

System.Windows.Media.VisualTreeHelper.HitTest(canvas1, p);

4. Я думаю, что что-то немного отличается от перегрузок, используемых для создания новых потоков с помощью

this.Dispatcher.BeginInvoke(....)

Ответ 7

Самая большая жалоба, которую я имею, - отсутствие полной поддержки всех доступных привязок WCF. Только возможность использования BasicHttpBinding очень часто означает, что решение проблемы Silverlight не является допустимым выбором.

Ответ 8

Нет поддержки 3D.

Ответ 9

Неизменяемые стили Silverlight и отсутствие слияния словарей также являются большими - если вы пишете элементы управления, эти два дают вам много хлопот - не говоря уже о неуправляемых больших файла generic.xaml.

Ответ 10

Перспектива 3d великолепна, но я не могу дождаться реального 3D!

Ответ 11

  • ScrollViewer не имеет события изменения (вам нужно использовать привязку)
  • Поддержка контекстно-зависимого меню браузера-агностика до версии 4
  • Ограниченная поддержка DocumentFlow
  • Нет поддержки MD5 (но вместо этого используются более современные алгоритмы хеширования)
  • WebClient не позволяет выполнять HTTP-аутентификацию.

Мой самый большой peeve:

  • Крысиное гнездо пространств имен