ピボット ビューアー コントロールでトレーディング カードのレンダリングがいつ完了したかを知るために使用できるイベント (または別のメカニズム/回避策) を探しています。コントロールの SL5 バージョンを使用し、その ItemSource に (監視可能なコレクションを介して) 追加しています。現在、コントロールにデータを提供してから、ピボット ビューア コントロールでアニメーション化されたものを確認するまでには、かなりのタイムラグがあります。ItemSource にデータを入力するスレッドが終了し、空白の画面を 5 ~ 10 秒間見つめた後、最終的にトレーディング カードの画像が表示されます。組み込みイベントは、トレーディング カード イメージのレンダリングがいつ「準備完了」状態になるかを示すものをサポートしていません。
3 に答える
私は同じ問題を抱えていたので、pivotviewer コントロールを拡張して独自のソリューションをコーディングしました 。
誰かがこれが役立つことを願っています!
ビジュアルがいつ読み込まれたかを検出するために私が見つけた最良の方法は、MultiScaleImage オブジェクトを見つけて、画像が「ダウンロード中」か「アイドル」か、および画像のビューポートが何であるかを検出することです。
SL5 の PivotViewer でそのオブジェクトを取得する方法は次のとおりです。
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 への参照があります。
PivotViewer オブジェクトに ItemsSource を設定するときは、約 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.
}
}
}
これはバージョン 5.0.61118 の SL .dll であることに注意してください (将来のバージョンでは、このコードは壊れる可能性が高いです)。
私はこれを調べました (PivotViewer 開発者と話しています) が、現在、レンダリングが完了したときに把握するために処理できるものは何もありません。
SL のレンダリング パフォーマンスを調査し、コレクションをロードした後にドロップを探すのが最善の選択肢かもしれません。かわいくないし、とにかくうまくいかないかもしれない...
出発点: http://msdn.microsoft.com/en-us/library/bb980092.aspx
Jason R. Shaver PivotViewer の前の PM