2009-09-03 5 views
7

Ho un ItemsControl in un ScrollViewer. Gli articoli nel numero ItemsControl vengono espansi in uno DataTemplate che consiste fondamentalmente in un Adorner.WPF Adorner Clipping

Ora il problema è che, durante lo scorrimento, i bambini visivi dello Adorner sono visibili all'esterno dello ScrollViewer. Diciamo che scorrono dall'Offset orizzontale da 0 a 100, i Bambini visivi dello Adorner si spostano a sinistra e sono visibili accanto allo ScrollViewer, sebbene debbano essere nascosti. L'impostazione ClipToBounds su ItemsControl o ScrollViewer non funziona.

Capisco, che Adorner sono resi sopra tutti gli elementi z-order wise, ma in realtà non dovrebbero essere visibili in questi casi come con lo ScrollViewer. L'adorned Element tra l'altro si comporta come previsto e non è visibile attraverso lo ScrollViewer.

C'è un modo semplice per "ritagliare" i Adorner s, in modo che siano visibili solo nell'area di scorrimento visibile?

Grazie, Andrej

+2

Quale versione di .NET/WPF è successo per te? In realtà sto cercando di ricreare questo comportamento e non posso. Fondamentalmente voglio che i miei errori di visualizzazione visualizzino oltre i limiti dello scrollviewer (senza usare un popup) –

risposta

2

che ho incontrato lo stesso problema quando sottoclasse il WPFToolkit DataGrid a disegnare uno strumento decorativo intorno alla cella corrente.

Il contenuto di ScrollViewer viene reso da un'istanza ScrollContentPresenter. ScrollContentPresenter ha il proprio livello di adorner, che è accessibile tramite la proprietà ScrollContentPresenter.AdornerLayer.

Ho trovato che il mio adorner si collega correttamente se lo aggiungo a quel livello.

+0

Come si ottiene ScrollContentPresenter dal codice? – stone

+0

Uso VisualTreeHelper per cercare l'albero visivo finché non trovo un discendente di tipo ScrollContentPresenter. Dai un'occhiata al metodo in questo thread: http://wpf.codeplex.com/Thread/View.aspx?ThreadId=34542. – hwiechers

5

L'impostazione ClipToBounds sul controllo contenitore non è sufficiente. È necessario impostare anche la proprietà IsClipEnabled del decoratore.

0

La mia soluzione era quella di spingere un area di visualizzazione sul contesto disegno, rendono tutto ciò di cui avevo bisogno, e pop il ritaglio, alla fine, in questo modo:

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

è possibile collegare questo in qualsiasi Adorner, il i limiti sono già disponibili come parte dell'elemento.