Различия между Silverlight на Windows и Windows Phone

Данный топик описывает различия реализации между Silverlight 3 на Windows и Silverlight на Windows Phone. Советую ознакомиться, что поддерживает Silverlight на Windows Phone, а также более детально ознакомиться с информацией о не поддерживаемых типах и членах.

Элементы управления

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

Медиа

В данном случае, опять советую обратится к первоисточнику Media on Mobile Phone.

Deep Zoom

Silverlight для Windows Phone всегда использует аппаратное ускорение в MultiScaleImage, если это возможно. В результате, любые изменения в свойстве CacheMode игнорируются.

Делегаты

Асинхронные делегаты, особенно методы BeginInvoke и EndInvoke, не поддерживаются в .NET Compact Framework. Если вы попытаетесь вызвать делегаты асинхронно, то приложение выкинет TargetInvocationException вместо NotSupportedException.

Финализаторы

Области с ограничением управления (CER) не поддерживаются в Silverlight для Windows Phone.

Шрифты

Все шрифты, которые являются доступными идут уже с ROM. Никакие шрифты не устанавливаются вместе с Silverlight. Рекомендуется использовать веб-безопасные шрифты такие, как Verdana и Segoe. Visual Studio 2010 Express for Windows Phone CTP включает в себя фильтры, которые отображают поддерживаемые шрифты на Windows Phone 7 Series. Если вы желаете использовать шрифты, которые не присутствуют на устройстве, рекомендуется поставлять их совместно с приложением. Также рекомендуется использовать TrueType шрифты. Встроенные шрифты должны добавляться в DLL или XAP, как embedded-ресурсы для runtime-поддержки в управляемом коде.

Графика

Поддерживаются графика, анимация и такие эффекты, как Blur и DropShadow. Все эффекты в Silverlight для Windows Phone могут использовать аппаратное ускорение, следовательно вы должны установить CacheMode для UIElement значение BitmapCache. Собственные пиксель-шейдеры не поддерживаются, следовательно PixelShader также не поддерживается. Более детальная информации о графике и анимации.

Размещение

Все Silverlight приложения на Windows Phone хранятся на клиентском устройстве и не выполняются внутри браузера. Весь функционал Silverlight, который основан на размещении в браузере - не доступен. Сюда входит HTML DOM мосты, возможность использовать JavaScript и ссылка на плагин объекта

Ввод

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

  • MouseLeftButtonUp для касания
  • Для обработки двойного нажатия, проверяйте было ли произведено нажатие два раза за определенные промежуток времени(TimeSpan). Если событие MouseMove не произошло в промежутке между нажатиями, то произошло двойное нажатие
  • Для обработки нажатия и удержания, запустите таймер TimeSpan по событию MouseLeftButtonDown и сохраняйте координаты касания. В событии MouseMove проверяйте сместилось ли касание пользователя на несколько пикселей. Если сместилось, отменяйте таймер. Если же события MouseLeftButtonUp произошло до истечения таймера, также отменяем таймер. Если время таймера истекло до отмены - зажатие произошло.

Вы также можете использовать события управления для ответа на пользовательский ввод. События управления поддерживают мультисенсорный ввод и могут быть использованы для перемещения и масштабирования объектов UIElement. В дополнение ознакомьтесь с How to: Handle Manipulation Events.

Изолированное хранилище

Изолированное хранилище позволяет приложению хранить данные в виртуальной файловой системе. Данные полностью отгорожены от других системных компонентов. Это предотвращает несанкционированный доступ и повреждение данных компонентами другого приложения, которое сохраняет данные. Изолированное хранилище на Windows Phone не налаживает дополнительные квоты на ограничение размера хранилища для Silverlight приложений. Размер приложения на Windows Phone может достигать до размера 2 ГБ. Различия между реализацией на платформах заключается в следующем:

  • Изолированное хранилище на Windows Phone не включает в себя концепцию сайта, поэтому GetUserStoreForSite не поддерживается.
  • IncreaseQuotaTo выкидывает исключение
  • В конструкторе класса IsolatedStorageFileStream не поддерживаются свойства FileShare.Delete и FileShare.Inheritable в силу ограничений платформы
  • Максимальный размер квоты для приложения по умолчанию равен MAXLONG

Подробнее о изолированном хранилище вы можете прочитать в соответствующих статьях: Isolated Storage и System.IO.IsolatedStorage

LINQ

LINQ провайдеры для собственных источников данных не поддерживаются в Silverlight для Windows Phone.

Локализация

Некоторые типы и члены, которые поддерживают локализацию работают несколько по иному:

  • Собственная культура возвращает стандартное форматирование, когда ожидается custom-форматирование. Например, 31/08/2006 12:30:15 вернется, как 8/31/06 12:30:15 PM.
  • Вы не можете использовать нейтральную культуру при форматировании и разборе, следовательно, вы не можете устанавливать нейтральную культуру как текущую культуру потока.
  • DateTimeFormatInfo.GetEra возвращает -1 для fr-FR культуры
  • Метод DateTimeFormatInfo.GetEraName возвращает некорректное значение в некоторых случаях. Та же fr-FR локализация строку DC, вместо ожидаемой A.D.
  • DateTime.ToString возвращает некоректную строку для русских дат. Например мы получаем 15 Июнь 2000, вместо 15 июня 2000.
  • Double.ToString() не возвращает корректную строку содержащую разделители-запятые, между группами чисел, когда используется собственный формат.

Мультисенсорность и события управления

Для работы с мельтисенсорностью и событиями манипуляции, Silverlight на Windows Phone поддерживает типы, члены и события, которые не представлены в Silverlight 3. Для дополнительной информации читайте How to: Handle Manipulation Events

Навигация

Silverlight на Windows Phone предоставляет отличные от Windows модели навигации по страницам. Классы Frame и Page не поддерживаются, для детальной информации ознакомьтесь с топиком Frame and Page Navigation

Сеть

Поддержка работы с сетью включает в себя Windows Communication Foundation (WCF), HttpWebRequest и WebClient. Собственные подключения и сокеты не поддерживаются. Потому что ChannelFactory(TChannel) не поддерживается и вы не можете генерировать доверенности динамически. Вы должны использовать в консоле slsvcutil.exe для генерирования на момент компиляции доверенностей. Опция Add Service Reference в Visual Studio так же генерирует доверенности, которые вы можете подключать во время компиляции. Данная опция не доступна в Windows Phone проектах в версии Community Technology Preview. Свойство Style класса XmlSerializerFormatAttribute не поддерживается. Это еще не все не поддерживаемые возможности, более детально об этом написано тут.

Производительность

Устройства обладают меньшей процессорной мощностью, хранилищем и памятью, чем настольные компьютеры. У них также ограниченное время работы из-за батареи. Вы должны проектировать приложения учитывая данные факты, особенно для тех приложений, которые используют анимацию и медиа. Некоторые устройства могут притормаживать, если использовать несколько Storyboard объектов или при манипулируя большим количество XAML-элементов. Для оптимизации XAML кода, во время применения сложных преобразований, Silverlight на Windows Phone поддерживает CompositeTransform.

Отражение

Реализация отражения(reflection) отличается от настольного:

  • Некоторые типы и члены не поддерживаются, со списком можно ознакомится в Class Library Support on Windows Phone
  • Открытые универсальные типы не поддерживаются.
  • Не поддерживается параметр ignoreCase в методе GetType. Вы должны использовать регистрозависимые названия типов.
  • Поведенческая и функциональная разница присутствует и у реализации binder в Silverlight 3 и .NET Compact Framework.
  • Оператор эквивалентности (==) не возвращает true для двух объектов MethodInfo.
  • Пространство имен System.Reflection.Emit не поддерживается
  • GetNestedTypes возвращает возвращает все вложенные типы(nested types) независимо от значения BindingFlags.
  • AssemblyName.GetPublicKeyToken возвращает null вместо byte[0] для byte[0] PKT или для имени сборки, содержащей PublicKeyToken=null.
  • Для параметра declaringType, MethodBase.GetMethodFromHandle(MethodHandle, TypeHandle) использует RuntimeMethodHandle, вместо RuntimeTypeHandle.
  • WaitHandle.WaitAll не поддерживается в .NET Compact Framework.
  • AssemblyName().ToString() и Assembly.FullName возвращает System.Reflection.AssemblyName, когда используется стандартный конструктор для инициализации объекта AssemblyName
  • ParameterInfo.DefaultValue возвращает null
  • Метод Type.GetMember не возвращает никаких публичных членов со указанным именем, если имя задана регулярным выражением.
  • Методы Type.GetMethods и Type.GetMembers не возвращают один и тот же экземпляр объекта.
  • AssemblyName.FullName не возвращает PublicKeyToken информацию по умолчанию. .NET Compact Framework предоставляет только имя сборки. Вы должны использовать отдельные методы для сравнения культур, версий и PKT-информации.
  • FieldInfo.ToString() возвращает System.Boolean[] вместо Boolean[] когда он указывает на bool.
  • Type.GetMethod(String, Type[]) возвращает null значения MethodInfo для метода Set(Int32, System.String), тогда как десктоп вернет значение MethodInfo, которое никак не равно null.
  • Возвращаемое значение для Type.AssemblyQualifiedName отличается между платформами. Например, возвращаемое значение для AssemblyQualifiedName на Silverlight под Windows Phone может выглядеть так: MyType, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089. Её эквивалент на десктопе: MyType, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=B17A5C561934E089

Регулярные выражения

В Silverlight для Windows Phone, свойство CacheSize всегда возвращает ноль, потому что реализация класса Regex не поддерживает кэширование.

Runtime

Silverlight под Windows Phone 7 Series работает на .NET Compact Framework.

Безопасность

Отличие состоит с X509 сертификатами, если вы передаете не верный флаг, когда создаете X509Certificate, выкидывается NotSupportedException, вместо ArgumentException.

SIP

Для возможности использовать программную панель ввода (SIP) для элемента управления TextBox, Silverlight для Windows Phone поддерживает несколько типов и членов, которые не присутствуют в Silverlight 3. Для более детальной информации ознакомьтесь с How to: Specify the SIP Layout in a TextBox. Silverlight Extensions for Windows Phone.

Расширения для Silverlight для Windows Phone

Для дополнительных возможностей, которые специфичны для разработки под Windows Phone, опять-таки читайте Class Library Reference for Windows Phone. Весь этот функционал включен в Windows Phone Developer Tools.

Текстовые кодировки

Кодировщик Encoding.Unicode переименован в System.Text.UnicodeEncoding и UnicodeEncoder. Декодировщик Encoding.Unicode переименован в System.Text.UnicodeEncoding и UnicodeDecoder.

Потоки

В отличии от Silverlight 3, Silverlight для Windows Phone разделяет работу анимации на два отдельных потока для улучшения производительности устройства. ThreadStaticAttribute не используется в .NET Compact Framework.

URIs

Класс HttpUtility находится в пространстве имен System.Net. В Windows данный класс находится в пространстве имен System.Windows.Browser, которое является не поддерживаемым для Windows Phone платформы. Uri.LocalPath не конвертирует слэш (/) в обратный слэш (\). Потому что URI для файлов (file://) не допустимы. Пути возвращаются, как относительные. Свойство OriginalString для экземпляров URI обрезает пробелы до передачи в URL.

XAML трансформации

Для оптимизации XAML, когда вы применяете множественные трансформации, Silverlight на Windows Phone поддерживает CompositeTransform.

XML

Разбор не поддерживается в следствии того, что .NET Compact Framework не поддерживает определение типа документа (DTD). Приложение выбрасывает NotSupportedExeption, когда обнаруживает DTD-строку в XML. Для разбора DTD приложение должно реализовать механизм распознания или использовать XML схемы. Часто используемый DTD обычно прогоняют через XmlPreloadedResolver. Данный тип присутствует в Silverlight 3 SDK, но не поддерживается в версии Community Technology Preview. Так же присутствуют следующие различия:

  • Сериализированный вывод объекта XmlSerializer типа XmlQualifiedName не до конца сформирован.
  • В .NET Compact Framewrok разрешено обвертывание в собственные классы для чтения. Вы можете создать свой класс для чтения, с собственной реализацией необходимых функций и далее передавать его на вход в XmlReader.Create(XmlReader, XmlReaderSettings)

Другие отличия

Существует еще несколько ограничений в API:

  • GetHashCode возвращает одинаковые значения для разных методов одного и того же класса.
  • System.DateTime.Now.Millisecond.ToString всегда возвращает ноль в Windows Phone Emulator
  • Decimal.Parse возвращает неверное decimal-значение, когда экспонента приближена к нулю. В Windows метод возвращает ноль. Например, для значения 0E-50 и 10900E-512 возвращаются неверные decimal-значения вместо нуля.
  • GetHashCode возвращает 0 для некоторых объявленных пользователем структур в .NET Compact Framework, а в .NET Framework значение не равное нулю

Исключения

Некоторые методы выбрасывают разные исключения в зависимости от платформы:

  • Если вы передаете неверный флаг, когда создаете X509Certificate, выбрасывается NotSupportedExeption вместо ArgumentException.
  • Если вы попытаетесь получить доступ к файлу с FTP, приложение выкинет NullReferenceExeption вместо NotSupportedException
  • Если вы попробуете использовать не поддерживаемые восточноазиатские языки, приложение выбросит PlatformNotSupportedException вместо TypeInitializationException
  • System.ArgumentNullException выбрасывается, когда пытаемся вернуть MemoryStream, размеров в ноль байт из файла ресурсов. В Windows, никакое исключение не появляется.
  • Обвертывая в собственный класс для чтения, приложение должно убедится, что ConformanceLevel в XmlReaderSettings установлено в Auto.
  • ArrayTypeMismatchException появляется, когда приложение пытается сохранить Stream.Null в переменной типа MemoryStream
  • Если вы вызовете статический конструктор, используя отражение, приложение выкинет ArgumentException вместо MethodAccessException.
  • Когда вы попытаетесь установить не целое значение integer полю базовому классу через наследника Type.InvokeMember выбросит MissingFieldException вместо ArgumentException.
  • .NET Compact Framework выбрасывает исключение, когда наследуется класс от Dictionary, где параметр ключа является перечислением.
  • Некоторые атрибуты аргументов конструктора и значения свойств могут привести к сбою Type.GetCustomAttributes
  • Поиск групповых делегатов виртуальных функций выбрасывает NullReferenceException в .NET Compact Framework, тогда как в .NET Framework мы получаем AccessViolationException
  • Если ваше приложение пытается вызвать несуществующий метод типа или пытается вызвать метод с неопределенностью, .NET Compact Framework выбросит AmbiguousMatchException.
  • Если вы передадите неверный путь в Path.GetDirectoryName(System.String), метод не выкинет исключение. Например System.IO.Path.GetDirectoryName(@«D:\temp\ .») вернет «D:\temp», а не исключение.
  • Path.GetDirectoryName(System.String) даже не выбрасывает исключение. если длинна пути длиннее, чем максимально разрешенное в системе.
  • Если вы передадите некорректную культуру в сателлит-сборку Assembly.GetSatelliteAssembly(System.Globalization.CultureInfo), метод выбросит FileLoadException в Windows и FileNotFoundException на Windows Phone
  • ArgumentException отображает сообщение Argument Exception вместо Exception of type 'System.ArgumentException'. Подобным же образом ArithmeticException отображает Arithmetic Exception вместо того, чтобы вывести строку, как в Windows.
  • ICollection.CopyTo(System.Array,System.Int32) выбрасывает ArgumentException вместо InvalidCastException
  • FieldInfo.GetValue(System.Object) выбрасывает ArgumentNullException, когда null передается, как первый параметр.
  • FieldInfo.Value(Object) выбрасывает InvalidCastException, когда преобразует значение поля информации объекта в строку используя string вместо ToString().
  • System.ServiceModel.Channels.MessageHeaders.CopyHeaderFrom отображает сообщение Specified argument was out of the range of valid values вместо The value of this argument must fall within the range 0 to 1.
  • Если вы передадите некорректное значение Array.SetValue(System.Object,System.Int32), метод выкинет InvalidCaseException вместо ArgumentException.
  • Array.GetLowerBound(System.Int32) не выбросит IndexOutOfRangeException, если передаваемое измерение равно разряду массива. Вместо этого, он возвращает 0, как значение нижней границы.
  • Если вы передаете некорректный путь в конструктор StreamWriter, то он выбросит InvalidArgumentException вместо DirectoryNotFoundException.
  • System.Runtime.Serialization.DataContractSerializer.ReadObject выбрасывает MethodAccessException вместо SecurityException, когда произошла попытка десериализовать тип IXmlSerializable, у которого приватный конструктор.
  • Выводимое сообщение для MissingMethodException является не правильным.
  • Если вы попытаетесь вызвать делегат асинхронно, приложение выкинет TargetInvocationException вместо NotSupportedException
  • System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(System.IO.Stream) выбросит SecurityException, когда ожидается MethodAccessException .
  • Если вы передадите ошибочное значение в System.Text.RegularExpressions.MatchCollection.CopyTo(System.Array,System.Int32), то метод выкинет PlatformNotSupportedException вместо ArgumentException
  • Если передать null-объект в CreateInstance, метод выбросит NullReferenceException вместо NotSupportedException
  • Если передать строку в System.Version.CompareTo, метод выбросит InvalidCastException вместо ArgumentException.
  • Delegate.CreateDelegate выкинет MissingMethodException, если попытаться создать делегат с неправильными аргументами. В Windows, метод не выбрасывает никаких исключений, а возвращает null.
  • Type.MakeByRefType не выбросит TypeLoadException, если метод MakeByRefType вызывается для ByRef типа.
  • Метод DateTime.ParseExact может принять некорректное время и не выкинет исключения FormatException, в тоже время на Windows вы получите FormatException
  • CompareInfo.Compare() не выбросит ожидаемое исключение ArgumentException, если вы передать неправильный объект CompareOptions.
  • XmlReader не обрушится, когда произойдет переполнение вычисления числового символ. Вместо этого он вернет пустую строку в XmlReader.Value.
  • Message.ToString() работает по другому на Windows Phone. Message.ToString() не отображает информацию о версии XML в .NET Compact Framework.
  • MethodBase.GetMethodFromHandle не выкидывает исключения, если передать неправильный обработчик на вход. Он просто вернет null.
  • Module.GetType не выбрасывает исключение ArgumentException, если передать пустую строку, кк имя типа. Он просто вернет null.
  • Assembly.LoadFrom(String) падает, если попробовать передать в загрузку файл, который не является сборкой. Так специально было спроектировано, это происходит на момент валидации метадаты, для предотвращения загрузки поврежденных образов.
  • Type.GetProperty выкинет NullReferenceException вместо ArgumentNullException, когда представленные типы параметров содержат null-элементы.
  • Assembly.GetType выкинет System.TypeLoadException вместо System.ArgumentException, если строковое значение равно null.
  • Type.GetConstructor(BindingFlags, Binder, Type[], ParameterModifier[]) выбросит ArgumentNullException, если не указан ParameterModifiers или null.
  • Path.GetRootPath вернет пустую строку, если на входные данные начинаются с пробела.
  • FieldInfo.SetValue() выкинет ArgumentNullException вместо TargetException, если передать null первому параметру.
  • EventInfo.AddEventHandler выкинет ArgumentNullException вместо TargetException, если передать null первому параметру.
  • EventInfo.AddEventHandler выбросит ArgumentNullException вместо InvalidOperationException , если у события отсутствует публичный add аксессор.
  • В некоторых ситуациях MethodBase.Invoke не выкинет TargetException , а может выбросить неожиданное исключение.
  • Если передать некорректные параметры в Type.GetType(typeName, throwOnError), метод выкинет неожиданное исключение вместо ArgumentException.
  • Если передать некорректные значения в PropertyInfo.GetValue, метод выбросит ArgumentNullException вместо TargetException.
  • Если количество индексаторов меньше, чем реальное количество, PropertyInfo.GetValue выкинет ArgumentException вместо TargetParameterCountException.
  • Если параметр assemblyFile не является корректной сборкой, Assembly.LoadFrom (String) выкинет System.IO.IOException вместо BadImageFormatException.
  • Если вы используете FieldInfo.SetValue() для публичного поля-константы, метод выбросит System.MemberAccessException вместо FieldAccessException.
  • Для тех типов, у которых не объявлен конструктор, System.Activator.CreateInstance(Type, object[]) выкинет MemberAccessException вместо MissingMethodException.
  • Если вы передадите некорректный параметр в Module.ResolveMethod, метод выкинет ArgumentException вместо ArgumentOutofRangeException.
  • Type.GetMethods выбросит InvalidProgramException, если один из методов содержит тип, который не доступен в runtime.
  • Если вы передадите некорректную строку в Assembly.Load(), он выкинет System.IO.IOException вместо ArgumentException.
  • Type.InvokeMember выкинет MissingFieldException, если имя аргумента содержит wildcard-символ.
  • ConstructorInfo.Invoke выбросит ArgumentException вместо TargetParameterCountException, если будет не соответствие количества аргументов.
  • Если вы передадите некорректную строку в конструктор AssemblyName(string), то он выкинет FileLoadException вместо IOException.
  • Если вы передадите некорректное имя в Assembly.GetType(string name), метод не выкинет ArgumentException, а вернет null.
  • Если установить CultureInfo(«fr»).NumberFormat.CurrencySymbol в «USD», то вы получите NotSupportedException.
  • Decimal.Parse(String format, int style) вернет 0 бесконечно малых величин в Windows, на Windows Phone вы получить OverlowException.
  • Decimal.Parse(String, NumberStyles) выкинет OverflowException, если передать большее, чем поддерживаемое, значение. Опять же никакого исключения в Windows в данном случае вы не увидите.
  • DCS.WriteObject() упадет, если вы попытаетесь сериализовать внутренний тип, котоыре содержит тип, унаследованный от Dictionary<TKey, TValue>, потому что открытые универсальные типы не поддерживаются.
  • Значения XmlException.LineNumber и XmlException.LinePosition не корректно возвращаются в XmlException.
  • Получая тип, используя свойство ReturnParameter объекта MethodInfo, вы наткнетесь на исключение NotSupportedException.
  • Если вы передадите некорректные параметры в System.String.IndexOfAny, то метод выкинет ArgumentOutOfRangeException вместо ArgumentNullException
  • Конструктор CultureInfo(string) выкинет PlatformNotSupportedException вместо ArgumentException для не поддерживаемых культур.

Источник: Различия между Silverlight на Windows и Windows Phone.

Реклама