Silverlight 5 new PivotViewer - определяет, когда торговые карты завершили рендеринг - PullRequest
0 голосов
/ 31 января 2012

Я ищу событие (или другой механизм / обходной путь), которое я могу использовать, чтобы узнать, когда завершился рендеринг торговых карт в элементе управления Pivot Viewer.Я использую версию элемента управления SL5 и добавляю к его ItemSource (через наблюдаемую коллекцию).В настоящее время существует большой разрыв между предоставлением элемента управления данными и просмотром чего-либо анимированного в элементе управления Pivot Viewer.Мой поток, который заполняет ItemSource, завершается, и после 5-10 секунд просмотра пустого экрана пользователь в конечном итоге видит изображения торговых карточек.Встроенные события не поддерживают индикацию того, когда рендеринг изображений с карточек находится в состоянии готовности.

Ответы [ 3 ]

1 голос
/ 06 декабря 2012

У меня была та же проблема, поэтому я разработал собственное решение, расширив элемент управления pivotviewer: http://stevenhollidge.blogspot.ch/2012/12/pivotviewer-itemsloaded-event.html

Надеюсь, кто-то найдет это полезным!

0 голосов
/ 07 января 2013

Лучший способ, который я нашел, чтобы определить, когда загружаются визуалы, - это найти объект MultiScaleImage и определить, являются ли изображения «Загружаемыми» или «Бездействующими», а также каков видовой экран изображения:

Вот как вы можете получить этот объект в PivotViewer в SL5:

Создайте подкласс объекта PivotViewer и поместите в переопределение OnApplyTemplate () следующее:

PartContainer = (Grid)this.GetTemplateChild("PART_Container");
cvv = (PartContainer).Children[2] as CollectionViewerView;

if (cvv != null)
{
    cvvm = ViewBehaviors.GetViewModel(cvv);
    Grid container = cvv.Content as Grid;
    Border viewerBorder = container.Children[1] as Border;
    Grid cvGrid = viewerBorder.Child as Grid;
    cvc = cvGrid.Children[0] as CollectionViewContainer;
}

Тогда у вас есть ссылка на cvv - CollectionViewerView.

Когда вы устанавливаете свой ItemsSource для объекта PivotViewer, запускайте таймер, который будет проверять каждые 300 мс или около того:

ItemViewerView ivv = ((Grid)(((UserControl)(cvc.Content)).Content)).Children[0] as ItemViewerView;
Grid g = (((Grid)ivv.Content).Children[0] as Grid);
ContentControl cc1 = (g.Children[0] as ContentControl);
if (cc1 != null)
{
    Canvas cvs = cc1.Content as Canvas;
    if (cvs != null && cvs.Children.Count > 0)
    {
        var contentControl = cvs.Children[0] as ContentControl;
        if (contentControl != null)
        {
            MultiScaleImage x = contentControl.Content as MultiScaleImage;
            bool isIdle = x.Source != null && !x.IsDownloading && x.IsIdle;
            // This could be more precise, but the origin is by default set to 99999 when a new image is loaded in - we're watching for when this value changes.                
            bool inViewPort = x.SubImages[x.SubImages.Count - 1].ViewportOrigin.X < 999999;
            // if both of these boolean values are true, then the images will be displaying on the screen.
        }
    }
 }

Обратите внимание, что это SL .dll с версией 5.0.61118 (будущая версия, скорее всего, этот код сломается)

0 голосов
/ 10 апреля 2012

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

Лучшим вариантом для вас может быть изучение производительности рендеринга SL и поиск падения после загрузки коллекции. Не красиво и не может работать в любом случае ...

Начальная точка: http://msdn.microsoft.com/en-us/library/bb980092.aspx

Джейсон Р. Шейвер Предыдущий PM для PivotViewer

...