Pull to refresh

Comments 12

Лучше Visibility.Hidden и Visible вместо Opacity.
Не факт что лучше. Visibility перерисует контрол заново, а Opacity этого делать не будет.
99% будет видна картинка, и только 1% времени она будет загружаться. И эти 99% времени прогрессбар висит в layout с работающей анимацией. Так что определенно Visibility.
По поводу выбора Visibility или Opacity:

Visibility.Collapsed — скрывает элемент, освобождает место, не обрабатывает ивенты (мышь, тач, клавиатура).
Opacity = 0 — делает элемент прозрачным, не освобождает место, обрабатывает ивенты (мышь, тач, клавиатура).

Что касается производительности (память)- Visibility.Collapsed предпочтительнее, а свойства, дающее Opacity = 0 мы не используем, значит Вы правы, и стоит заменить Opacity =0 на Visibility.Collapsed и Opacity = 100 на Visibility.Visible
Для универсальности, лучше убрать Border из контрола. Кому нужно сможет добавить сам, а вам не надо будет прокидывать его свойства.

Ещё тонкий момент, с WinRT я плотно не работал, но тут скорее всего тоже. Если передать вашему контролу источник с уже загруженным изображением, то кольцо не исчезнет. И, возможно, такое можно воспроизвести, когда вы отображаете список с одними и теми же картинками.
По поводу бордера — нет смысла его убирать, достаточно правильно назначить начальные условия внутри самого контрола.
Про загруженное изображение — эта будет не проблема, если изначально кольцо будет скрыто. Решается добавлением одной записи прямо в xaml контрола.
Если вы хотите, что бы ваше решение было универсально, то бордер все же лучше убрать. Даже в рамках одного проекта изображения могут использоваться в нескольких разных видах. Да и когда бордер не нужен, лучше, чтоб его не было в визуальном дереве. Любой лишний элемент влияет на скорость отрисовки кадра. Иногда некоторые мелочи влияют на производительность очень значительно. Впрочем это надо выстрадать с профилеровщиком.

Что касается изображения.
controll.Image.Source = val;
if(val.Width == 0 || double.IsNaN(val.Width))
{
controll.Ring.Opacity = 100; // controll.Ring.Visibility = Visibility.Visible;
}

Примерно так. Может нужно использовать проверку получше. иначе опять же не будешь же создавать разные контролы для разных мест
WinRT это хорошо, а что с Windows Phone? Вы же не используете какое-то специфическое API?
ProgressRing придется заменить на ProgressBar или что-либо ещё.
Единственное отличие — использование ProgressRing (его нет в WP). Заменить его можно на ProgressBar из Windows Phone Toolkit для WP7, либо же из «коробки» для WP8
Спасибо. В таком случае, вы можете сделать абстракцию над Progress component, и ваш компонент станет годным вообще для всех современных windows-систем.
В Windows Phone Toolkit есть PerformanceProgressBar. Обычный ProgressBar на #wp7 тоже из коробки.
Sign up to leave a comment.

Articles