2009-09-03 48 views
7

我有一個ItemsControlScrollViewerItemsControl中的項目擴展爲DataTemplate,其基本上由Adorner組成。WPF Adorner Clipping

現在的問題是,當滾動時,Adorner的視覺兒童在ScrollViewer之外可見。比方說,我從水平偏移量0滾動到100,Adorner的視覺兒童移動到左側,並且在ScrollViewer旁邊可見,但它們應該隱藏。在ItemsControlScrollViewer上設置ClipToBounds不起作用。

據我所知,Adorner被呈現在所有元素z順序明智,但他們真的不應該在這種情況下可見,如ScrollViewer。順便提一下,Element的行爲與預期相似,並且通過ScrollViewer不可見。

是否有任何簡單的方法來「剪輯」Adorner s,以便它們僅在可見滾動區域中可見?

感謝, 安德烈

+2

什麼版本的.NET/WPF發生了這種事情?其實我試圖重新創建這種行爲,我不能。基本上我希望我的錯誤裝飾物顯示超過scrollviewer的邊界(不使用彈出窗口) –

回答

2

子類WPFToolkit DataGrid中繪製當前單元格周圍裝飾器時,我遇到了同樣的問題。

ScrollViewer的內容由ScrollContentPresenter實例呈現。 ScrollContentPresenter有它自己的裝飾圖層,可以通過ScrollContentPresenter.AdornerLayer屬性訪問它。

我發現我的裝飾正確剪輯,如果我將它添加到該圖層。

+0

如何從代碼中獲取ScrollContentPresenter? – stone

+0

我使用VisualTreeHelper搜索可視化樹,直到找到ScrollContentPresenter類型的後代。看看這個線程中的方法 - http://wpf.codeplex.com/Thread/View.aspx?ThreadId=34542。 – hwiechers

5

設置ClipToBounds上的包含控件是不夠的。您也必須設置裝飾者的IsClipEnabled屬性。

0

我的解決辦法,推動剪輯區域到繪圖背景下,呈現什麼我需要,並在年底流行的剪裁,就像這樣:

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

您可以插入到這一點任何裝飾器,該邊界已經可以作爲元素的一部分。