2009-09-03 3 views
7

Ich habe eine ItemsControl in einer ScrollViewer. Die Artikel in der ItemsControl werden zu einer DataTemplate erweitert, die im Wesentlichen aus einer Adorner besteht.WPF Adorner Clipping

Jetzt ist das Problem, wenn Scrolling, die Visual Children der Adorner sind außerhalb der ScrollViewer sichtbar. Nehmen wir an, ich scrolle von der horizontalen Verschiebung 0 bis 100, die visuellen Kinder der Adorner bewegen sich nach links und sind neben der ScrollViewer sichtbar, obwohl sie versteckt werden sollten. Die Einstellung ClipToBounds auf der ItemsControl oder die ScrollViewer funktioniert nicht.

Ich verstehe, dass Adorner sind über alle Elemente z-Reihenfolge weise gerendert, aber sie sollten wirklich nicht in solchen Fällen wie mit der ScrollViewer sichtbar sein. Die geschmückte Element verhält sich übrigens wie erwartet und ist nicht durch die ScrollViewer sichtbar.

Gibt es eine einfache Möglichkeit, die Adorner s zu "clip", so dass sie nur im sichtbaren Bildlaufbereich sichtbar sind?

Danke, Andrej

+2

Welche Version von .NET/WPF ist das für Sie passiert? Ich versuche tatsächlich, dieses Verhalten nachzubilden, und ich kann nicht. Grundsätzlich möchte ich meine Fehler Adorners über die Grenzen des Scrollviewer anzeigen (ohne ein Popup) –

Antwort

2

Ich habe das gleiche Problem auftreten, wenn die WPFToolkit Datagrid-Subklassen eine adorner um die aktuelle Zelle zu ziehen.

Der Inhalt des ScrollViewers wird von einer ScrollContentPresenter-Instanz gerendert. ScrollContentPresenter verfügt über eine eigene Adorner-Ebene, auf die über die Eigenschaft ScrollContentPresenter.AdornerLayer zugegriffen werden kann.

Ich habe festgestellt, dass mein Adorer korrekt Clips, wenn ich es zu dieser Schicht hinzufügen.

+0

Wie erhalten Sie den ScrollContentPresenter von Code? – stone

+0

Ich benutze VisualTreeHelper, um den visuellen Baum zu durchsuchen, bis ich einen Nachfolger vom Typ ScrollContentPresenter finde. Sehen Sie sich die Methode in diesem Thread an - http://wpf.codeplex.com/Thread/View.aspx?ThreadId=34542. – hwiechers

5

Einstellung ClipToBounds auf dem enthaltenden Steuerelement ist nicht genug. Sie müssen auch die Eigenschaft IsClipEnabled des Adorners festlegen.

0

war meine Lösung einen Clip Region auf das Zeichen Kontext zu schieben, machen, was ich brauchte, und den Ausschnitt am Ende Pop, wie folgt aus:

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

du in in jede Adorner anschließen können, die Grenzen sind bereits als Teil des Elements verfügbar.