Лучший способ, который я нашел, чтобы определить, когда загружаются визуалы, - это найти объект 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 (будущая версия, скорее всего, этот код сломается)