2009-09-03 1 views
7

私は、をScrollViewerに持っています。 ItemsControlの項目はDataTemplateに展開され、基本的にAdornerで構成されています。WPF Adorner Clipping

スクロールするときに、のビジュアルチルドレンがScrollViewerの外側に見えるという問題がありました。 Horizo​​ntal Offset 0から100までスクロールし、Adornerのビジュアル・チルドレンが左に移動し、ScrollViewerの横に表示されますが、それらは非表示にする必要があります。 ItemsControlまたはScrollViewerClipToBoundsを設定しても機能しません。

Adornerはすべての要素の上にzオーダーでレンダリングされていますが、実際にはScrollViewerのように表示されるべきではありません。途中でElementという装飾が施され、ScrollViewerで表示されません。

Adornerを「クリップ」する簡単な方法はありますか?可視スクロール領域にしか表示されません。

おかげで、 アンドレイ魏周は次のスレッドで

+2

これは.NET/WPFのどのバージョンでしたか?私は実際にこの動作を再現しようとしており、できません。基本的には、私のエラーアドボーンダーがスクロールビューアーの境界を越えて表示するようにしたい(ポップアップを使わずに) –

答えて

2

現在のセルの周りadornerを描画するためにWPFToolkitのDataGridをサブクラス化するとき、私は同じ問題が発生しました。

ScrollViewerのコンテンツは、ScrollContentPresenterインスタンスによってレンダリングされます。 ScrollContentPresenterには独自のadornerレイヤがあり、これはScrollContentPresenter.AdornerLayerプロパティからアクセスできます。

私がそのレイヤーに追加すると、自分のアドラーが正しくクリップすることがわかりました。

+0

ScrollContentPresenterをコードからどうやって得るのですか? – stone

+0

VisualTreeHelperを使用して、ScrollContentPresenter型の子孫が見つかるまでビジュアルツリーを検索します。このスレッドのメソッドを見てください - http://wpf.codeplex.com/Thread/View.aspx?ThreadId=34542 – hwiechers

5

含有コントロールのClipToBoundsを設定するだけでは不十分です。 adornerのIsClipEnabledプロパティも設定する必要があります。

0

私のソリューションは、描画コンテキスト上にクリップ領域を押し、私は必要なものは何でも、レンダリング、およびこのように、最後にクリッピングをポップすることでした:

drawingContext.PushClip(new RectangleGeometry(new Rect(0, 0, this.AdornedElement.RenderSize.Width, this.AdornedElement.RenderSize.Height))); 
// continue drawing 
drawingContext.Pop(); 

あなたはどのAdornerにこれをプラグインすることができ、境界はすでに要素の一部として利用可能です。