2012-01-31 6 views
0

Pivot Viewerコントロールでトレーディングカードのレンダリングが完了したことを知るために使用できるイベント(または別のメカニズム/回避策)を探しています。私はコントロールのSL5バージョンを使用して、ItemSourceに(観察可能なコレクションを介して)追加しています。現在、コントロールにデータを提供することと、ピボットビューアーコントロールでアニメーションを見ることとの間にはかなりの遅れがあります。 ItemSourceを読み込むスレッドが終了し、空白の画面を見て5〜10秒後に、ユーザーは最終的にトレーディングカードの画像を見る。ビルトインイベントは、トレーディングカード画像のレンダリングがいつ「準備完了」状態にあるかの表示をサポートしない。Silverlight 5 new PivotViewer - トレーディングカードのレンダリングが完了したときの検出

答えて

0

私はこれを調べました(PivotViewer開発者と話しています)、現在、レンダリングが完了した時点を把握するための処理はありません。

SLレンダリングのパフォーマンスを調べて、コレクションをロードした後にドロップを探すのが最適な方法です。きれいではありませんし、ポイントを開始しています...とにかく

を動作しない可能性があります:私は拡張することによって、自分自身のソリューションをコード化されたようhttp://msdn.microsoft.com/en-us/library/bb980092.aspx

ジェイソンR.シェーバーPivotViewer

0

ビジュアルが読み込まれたときに検出する最も良い方法は、MultiScaleImageオブジェクトを見つけて、画像が「ダウンロード中」か「アイドル」か、画像のビューポートが何であるかを検出することです。

オーバーライド)

サブクラスPivotViewerオブジェクトをと(OnApplyTemplateに次のように配置します:

は、ここでは、SL5でPivotViewerにそのオブジェクトで得ることができる方法だ

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がありますコードはおそらく破損する)