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

Каковы самые большие ошибки в Silverlight?

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

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

Итак, что у вас есть?

Обновление
Я обновил это, чтобы охватить Silverlight в целом. Поэтому, пожалуйста, предоставьте версию или список версий, к которым относится информация о получении при ответе. Для всех без версии, пожалуйста, предположите Silverlight 2.0, как это было в исходном вопросе.

4b9b3361

Ответ 1

Два из них, которые я испытал:

Файлы политики перекрестных доменов

Для Silverlight для работы с веб-службами, размещенными в другом домене, серверу требуется файл политики междоменной политики. Это может принимать два формата:

  • clientaccesspolicy.xml
  • crossdomain.xml

Я не мог заставить первого работать правильно, но последний работал (Flash использует второй, тогда как я считаю, что первый относится к ASP, хотя я не мог заставить его работать под сервером ASP.NET 2.0, поэтому он может быть 3,5-специфическим).

Изменение выпадающего списка ComboBox

Элемент управления Silverlight 2.0 combobox только один раз раскрывает область раскрывающегося списка, когда он впервые показан. Поэтому он основывает его на начальных элементах в своем списке. Это означает, что 2 элемента дадут вам всплывающее окно с 2-мя элементами, даже если список увеличивается до 200. Единственный способ, по-видимому, состоит в том, чтобы заменить комбо с помощью всего нового элемента управления каждый раз, когда элементы меняются.

Обратите внимание, что при установке свойства Height или MaxHeight значение, которое приводит к элементам, выходящим из списка на начальном экране выпадающего списка, приведет к отсутствию вертикальной полосы прокрутки и, следовательно, к отсутствию доступа к элементам в ваш список. Единственное решение, которое я нашел, это использовать свойство MinHeight, по крайней мере, иметь приличную высоту для всех целей и просто позволить ей быть больше, если элементы превышают эту минимальную высоту.

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

<Я > Обновление

Вот действительно хорошее решение комбо-задачи, благодаря markti.

Ответ 2

Сложность ComboBox

Одна вещь, которую Джефф Йейтс упомянул в своем ответе, была странной с ComboBoxes - я видел это лично, и я также видел еще одно очень, очень раздражающее вопрос с ними. Если вы попытаетесь изменить элементы в ComboBox из обработчика события для события Click, вы получите загадочное сообщение об ошибке, о котором я не могу сейчас думать. Моим решением было сделать то же самое, что и в решении Jeff - удалить поле со списком, построить новый, заполнить его с помощью измененного набора элементов и добавить его обратно на содержащую панель.

Нет привязки ElementName

Silverlight не имеет ничего похожего на способность привязки WPF ElementName. Этот пост имеет хорошее обходное решение, которое сработало для меня хорошо.

Нет поддержки событий колесика мыши

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

Не выгружено событие в UserControls

Есть событие Loaded, но без Unloaded - если вы хотите удалить элемент управления с экрана и запустить некоторую логику разгрузки, вам нужно сделать свой собственный способ сделать это. У меня есть интерфейс IUnloadable, из которого я получаю свои элементы управления, из которых необходимо запустить логику разгрузки и вызывать метод на нем вручную, когда время верное.


И наконец, этот пост содержит некоторую полезную информацию о том, что отсутствует Silverlight по сравнению с тем, что имеет WPF.

Ответ 3

Отсутствие события двойного щелчка было для меня одним. Я был поражен тем, что его там нет, и продолжал искать в списке intellisense:-) Решил его, создав взломать его, но это не решение.

Ответ 4

Я обнаружил, что поддержка отладки невероятно flaky. Он работал у меня один раз, но с тех пор, как бы я ни старался. Я думаю, что он может корректно работать только при отладке через сайт ASP.NET 3.5 с использованием поддержки Silverlight ASP.

решаемые

Проблема заключалась в использовании Google Chrome. Поскольку Google Chrome использует Silverlight в своем собственном процессе, отладчик не смог его найти. Если вы отлаживаете работу с использованием IE7, он прекрасно подключается, но если вы отлаживаете использование Chrome, вам нужно вручную подключиться к соответствующей задаче Silverlight в Chrome до ее работы.

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

Ответ 5

Тот, кто недавно получил меня, состоял в том, что нет свойства LayoutTransform (хотя есть свойство RenderTransform). Поэтому вы не можете применять преобразование и иметь смежные элементы в соответствии с "требованиями к новому пространству" элемента управления, который затем заставит его пересекаться с другими элементами или иметь пустое пространство.

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

Ответ 6

Использование IE6 и веб-сайта, на котором размещено приложение Silverlight, с включенным сжатием (заголовки HTTP 1.1)

Всякий раз, когда вы вызываете вызов веб-службы, он просто терпит неудачу, даже если Fiddler показывает отправленный запрос и успешный ответ.

Ответ 8

HttpWebRespone может иметь только один из двух кодов состояния

  • 200 OK
  • 404 Не найдено

Это означает, что все другие ошибки сопоставляются с 404, что очень раздражает. Я не знаю, как работают перенаправления (я надеюсь, что они автоматически выполняются...)

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

Ответ 9

Тот факт, что в течение короткого периода времени существует так много разных релизов.

Хороший - вещи, которые расстраивают, быстро исправляются. например колесо прокрутки мыши, щелкните правой кнопкой мыши - исправлено в Silverlight 4.

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

Ответ 10

В то время как я делал проект в Silverlight 2.0, и проект управлялся с использованием TDD и MVP. Мои ссылки на службы были расположены в отдельной сборке, поэтому представление не обязательно должно знать модель. У меня возникла проблема с расположением файла ServiceReferences.ClientConfig, который должен быть в сборке просмотра!

Этот файл создается, если вы добавляете ссылку на службу. Мы добавили веб-службу WCF, но я был знаком с Silverlight и поэтому не знал, что приложения Silverlight скомпилированы и упакованы как XAP.

Если ваш файл ServiceReferences.ClientConfig не находится внутри этого XAP, у вас есть проблемы.

Итак, мои два цента стоят. Я опубликовал это некоторое время назад на форумах Silverlight, и кажется, что я не единственный, к которому это применимо.

Мой исходный пост

Ответ 11

О, есть грузы. Давайте начнем с 3 браузеров:

Все, кроме IE. Объект Silverlight не будет масштабироваться в соответствии с окном браузера. Обход проблемы: поместите это между тегами:

<style type="text/css">
  html, body, form { height: 100% }
</style>

Также имейте в виду, что IE позволит вам иметь свой веб-сайт dev в локальном хосте, а ваше приложение - доступ к другим доменам, тогда как другие браузеры не будут.

Safari. Если вы используете настраиваемые заголовки ответов (которые полезны для эффективного подкачки в службах данных), Safari может изменить регистр имен заголовков, нарушающих ваше приложение.

Проблемы с видимостью

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

Если вы получаете неожиданное прерывистое исключение ArgumentException, это может быть связано с тем, что у вас есть код в событии с нажатием кнопки, что делает кнопку самой (или ее родителя) невидимой. По-видимому, некоторый внутренний код запускается после события click, ожидающего, что кнопка будет видимой. Обходите это, создавая короткий (100 мс, например) DespatcherTimer в событии клика и устанавливая кнопку невидимой в событии Tick.

Проблемы с DependencyObject/DependencyProperty

Если вы привыкли к тому, как они работают в WPF, они полностью разбиты в Silverlight. Если ваши объекты данных являются DependencyObjects, у вас будет 2 проблемы. Один из них заключается в том, что в SL DependencyProperties нет встроенного уведомления об изменении - если вы хотите, чтобы они обновляли привязки, вам нужно, чтобы ваш объект реализовал INotifyPropertyChanged. Другое дело, если вы привязаны к коллекции DependencyObjects, вы получите очень странные эффекты. Вам нужно использовать класс немного дальше по иерархии управления - вместо этого я унаследовал от FrameworkTemplate. Поэтому я бы рекомендовал, чтобы ваши объекты данных выглядели следующим образом:

public class CustomDataObject : FrameworkTemplate, INotifyPropertyChanged
{ ... }

Конвертеры

Там нет многозначного преобразователя и нет Binding.DoNothing. Обходных решений для этих я не знаю.

Ответ 12

OpenFileDialog/изолированное хранилище

Чтобы ваше приложение первоначально использовало или увеличивало локальное хранилище, вы должны указать, сколько места вам нужно, а затем Silverlight запрашивает пользователя, хочет ли он разрешить изменение. Это все хорошо. Но есть улов: если вы откроете диалог с файлом, после этого момента невозможно получить больше памяти. В моем сценарии пользователь выбрал файл (ы), я обработал их, а затем вычислил, сколько места мне потребуется для сохранения обработанного файла. Но из-за этой проблемы я должен был догадаться, что такое максимальный размер этого файла, и попросить об этом на основе хранилища. Если файл был больше, пользователю пришлось бы выполнить весь процесс заново.

Макетная система

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

Нет LayoutTransform

Упоминается выше от Travis

Ответ 13

Отладка может быть сложной, если она не работает, возможно, потому, что вы подключаетесь к неправильному типу кода в процессе. Попробуйте вручную подключиться к процессу и убедитесь, что вы выбрали "код Silverlight" вместо "управляемого кода". С этого момента он, вероятно, будет работать все время снова.

Ответ 14

Ящик сообщений

Недавно я работал с System.Windows.MessageBox статическим классом (в настоящее время это единственный способ получить что-то близкое к модальности приложения, а не просто пользовательский интерфейс - пользовательская обратная связь), и я обнаружил раздражающую фокусировку, благодаря которой окно сообщения возвращает фокус в браузер, а не элемент управления Silverlight, который имел фокус, прежде чем отображалось окно сообщения. Это, несомненно, связано с подключаемым модулем Silverlight с использованием браузера, чтобы отображать окно сообщения, но оно раздражает все-таки, и в сочетании с ограниченными возможностями, доступными для настройки окна сообщения, вскоре стало очевидно, что мне нужно что-то еще, чтобы обеспечить мою обратную связь с пользователем.

Блокирование доступа к пользовательскому интерфейсу при показе всплывающего окна...

После поиска в Интернете было ясно, что мне нужно будет использовать какой-то модный дисплей пользовательского интерфейса, основанный на Popup примитивный. Итак, я перевернул собственный класс модального диалогового окна, и я обнаружил еще одну проблему в этом процессе.

Пользовательский интерфейс под всплывающим окном остается активным, что означает, что вкладка будет иметь доступ к элементам управления, которые вы пытаетесь скрыть. Чтобы смягчить это, я сначала попытался отключить страницу, получив RootVisual (т.е. страницу) и установив IsEnabled до false. Это отлично работало, пока я не использовал свое диалоговое окно во время операции редактирования DataGrid. Диалоговый код работал дважды и никогда больше. Казалось, что отключение и включение сетки во время редактирования вызвало какую-то неустранимую проблему в Silverlight (возможно, утечку памяти, поскольку она в конечном итоге разбилась).

Оказывается, для достижения того, что я хотел, самым простым способом является установка фокуса на что-то в моем всплывающем диалоге и установка TabNavigation для KeyboardNavigationMode.Cycle. Таким образом, фокус никогда не покидает диалоговое окно, поэтому основной пользовательский интерфейс остается вне границ, но без создания вышеупомянутой проблемы.

Ответ 15

Модальные всплывающие окна не поддерживаются Решение. Создайте элемент управления пользователя, который расширяет весь холст и устанавливает непрозрачность .05. как показано на примере приложения Silverlight от ScottGu http://weblogs.asp.net/scottgu/pages/silverlight-2-end-to-end-tutorial-building-a-digg-search-client.aspx

Наборы данных не поддерживаются Решение. Используйте LINQ to XML, который может читать XML в общий список для привязки данных.

Основные страницы не поддерживаются Решение. Создайте родительскую страницу XAML и создайте остальную часть приложения с помощью элементов управления пользователя, чтобы вы могли переключаться между ними.

Проблемы с пространством имен возникают при использовании набора инструментов AJAX вместе с тегом Silverlight ASP.NET.
Решение. Используйте тег OBJECT вместо тега Silverlight ASP.NET.

Ответ 16

Неудачно, что Silverlight проглатывает столько исключений при отладке.

Ответ 17

Управление с помощью ресурсов...

Объявление элемента управления в ресурсах, а затем попытка его поместить в Popup позже приведет к исключению, в котором указано, что элемент управления уже имеет родителя. В этом случае невозможно определить, что такое родитель и удалить его (я пробовал много разных способов). Обходной путь состоял в том, чтобы включить мой контроль во всплывающем окне в ресурсах, а затем сделать мой код либо повторно использовать это всплывающее окно, либо просто отбросить его в пользу моего собственного, повторно очистив элемент управления. Поскольку элемент управления может идентифицировать всплывающее окно как его родителя, это легко сделать.