Устранение мерцания маски непрозрачности при установке Button.Visibility = Visible в Windows Phone 7 - PullRequest
1 голос
/ 05 декабря 2011

Я пытаюсь найти способ устранить эффект мерцания, который появляется при установке Visibility = Visible на некоторые кнопки в моем приложении.

Мое приложение содержит ListBox, содержащее около 100 элементов.Я оформляю элементы с помощью DataTemplate, и каждый ListItem содержит два Button элемента.Когда приложение запускается, один из элементов кнопки устанавливается на Visibile, а другой - Collapsed.

Я также использую OpacityMask на кнопках, чтобы они могли менять цвета с помощьюЦветовая схема пользователя (светлая или темная).

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

После этого переключение назад и вперед работает должным образом без задержки или мигания.

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

Любые другие предложения?

Ответы [ 5 ]

2 голосов
/ 05 декабря 2011

Немного сложно сказать полностью без репро-проекта, но вот пара предложений.

  1. Вы всегда можете предварительно загрузить изображения (загрузив их в BitmapImage и т. Д.), Если это действительно ваша проблема (а затем установить источник изображения для этих переменных). Обратите внимание на использование памяти в этом сценарии, если ваши изображения большие!
  2. OpacityMask - зло (по телефону). Мы постоянно говорим людям об этом - поскольку OpacityMask не может быть рассчитан на GPU, мы делаем все это программно, а это значит, что вы получаете плохую производительность (тем более, что все это делается в потоке пользовательского интерфейса). Лучшая практика: не используйте OpacityMask.
  3. Если это Mango, убедитесь, что у вас есть правильные CreateOptions , использование DelayCreation превосходно для общей производительности, но может иметь всплывающий эффект, который может быть тем, что вы видите (так как изображение загруженный вне потока, мы будем отображать пользовательский интерфейс перед загрузкой изображения, а затем перерисовывать, когда изображение полностью загружено + декодировано).
1 голос
/ 05 декабря 2011

Это, вероятно, потому что вы используете OpacityMask внутри ваших Button стилей, и у вас много Buttons.

OpacityMask не может быть вычислено графическим процессором. Он будет работать в вашем потоке пользовательского интерфейса и вызывать перерисовку.

Возможно, вы просто хотите создать два разных изображения для вашей темной и светлой темы.

0 голосов
/ 05 декабря 2011

Я рекомендую преобразовать изображение в путь XAML и использовать Fill of PhoneBackgroundBrush или PhoneForegroundBrush для обработки тем. Вы получите преимущество масштабируемого векторного изображения, и оно может быть полностью выгружено в графический процессор

0 голосов
/ 05 декабря 2011

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

0 голосов
/ 05 декабря 2011

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

Попробуйте с 5-10 пунктами, посмотрите, сохраняется ли проблема?Также нам нужно увидеть код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...