2011-04-14 30 views
14

私は、スクロールビューア内にテキストブロック項目のスタックパネルを含んでいます(実際にはtabitemsですが、スクロールビューア内のスタックパネルを使用してtabcontrolテンプレートのデフォルトタブパネルをオーバーライドしています)。選択したタブが変更されたら、新しく選択したタブをスクロールビューアの表示領域の中心に移動します。理想的には、これはすべてのタブ、さらに遠い側のタブでも機能しますが、スクロールビューワにスクロールして、特定の要素ができるだけ中心に近いように伝えることができたら解決します。WPF - スクロールビューアのコンテンツのセンタリングですか?

これをWPFで実現する方法はありますか?私が考えることができるすべてのソリューションは、カスタムコントロールに関する多くの作業を含んでいます。

enter image description here

+0

スクリーンショット: [http://img20.imageshack.us/i/tabscreenshot.png/](http://img20を。 imageshack.us/i/tabscreenshot.png/) –

+2

@Robert Levy:これはどのように行うべきかではありません。答えが実際に質問に答えることができない場合、それらを受け入れる必要はありません。 –

答えて

7

ScrollViewer.ScrollToHorizontalOffset()あなたが探しているものです。あなたの選択した要素のオフセットがスタックパネルに対してどのようなものであるかを計算する必要があります。 selectedElement.TranslatePoint(new Point(), stackPanel)

これを遠端の要素に適用するには、スクロールビューアの開始点と終了点に「空白」要素を追加して適切なスペースを取る必要があります。

、これはかなり見えるように代わりにジャンプ

12

のあなたは簡単に次のコードを使用して、中心にコンテンツを設定することができ、スクロール「アニメーション」を作るためにタイマーでScrollToHorizo​​ntalOffsetを呼び出すために、

scrollviewer.ScrollToVerticalOffset(scrollviewer.ScrollableHeight/2); 
scrollviewer.ScrollToHorizontalOffset(scrollviewer.ScrollableWidth/2); 
+0

このチップをありがとう。私はMVVMパターンであり、ズームの際に画像を中央に保持する必要がありました。私は単純に私のScrollChangedイベントでコマンドを使用し、コマンドにパラメータとしてscrollviewerを渡しました。そこから、自分のコンテンツセンターをViewModelから保護することができました。しかし、少しハックのようだ。私はおそらく最終的に、依存性プロパティを介してこれを行うカスタムスクロールビューアを作成します。 – KyleLib

0

これが私の仕事:説明を支援するため

//for ScrollViewer s; 
s.ScrollToHorizontalOffset((s.ExtentWidth - s.ViewportWidth)/2); 
s.ScrollToVerticalOffset((s.ExtentHeight - s.ViewportHeight)/2); 
関連する問題