2009-09-03 11 views
7

Tengo ItemsControl en un ScrollViewer. Los elementos en el ItemsControl se expanden a DataTemplate que básicamente consiste en Adorner.WPF Adorner Clipping

Ahora el problema es que, cuando se desplaza, los Visual Children del Adorner son visibles fuera del ScrollViewer. Digamos que me desplazo desde el Desplazamiento Horizontal 0 a 100, los Niños Visual del Adorner se mueven hacia la izquierda y son visibles al lado del ScrollViewer, aunque deben estar ocultos. La configuración ClipToBounds en el ItemsControl o el ScrollViewer no funciona.

Entiendo que Adorner se representan por encima de todos los elementos en orden z, pero en realidad no deberían ser visibles en casos como el ScrollViewer. El adornado Element por cierto se comporta como se esperaba y no es visible a través del ScrollViewer.

¿Hay alguna manera fácil de "cortar" el Adorner s, de modo que solo se vean en el área de desplazamiento visible?

Gracias, Andrej

+2

¿Qué versión de .NET/WPF hizo esto para usted? En realidad estoy tratando de recrear este comportamiento y no puedo. Básicamente quiero que mis adornos de error se muestren más allá de los límites del scrollviewer (sin usar una ventana emergente) –

Respuesta

2

que he encontrado el mismo problema cuando la subclasificación de la WPFToolkit cuadrícula de datos para dibujar un adorner alrededor de la celda actual.

El contenido del ScrollViewer se representa mediante una instancia de ScrollContentPresenter. ScrollContentPresenter tiene su propia capa de adorno, que se puede acceder a través de la propiedad ScrollContentPresenter.AdornerLayer.

Encontré que mi adorno se recorta correctamente si lo agrego a esa capa.

+0

¿Cómo se obtiene el ScrollContentPresenter del código? – stone

+0

Uso VisualTreeHelper para buscar en el árbol visual hasta que encuentre un descendiente de tipo ScrollContentPresenter. Eche un vistazo al método en este hilo - http://wpf.codeplex.com/Thread/View.aspx?ThreadId=34542. – hwiechers

5

El ajuste ClipToBounds en el control que contiene no es suficiente. Debe establecer la propiedad IsClipEnabled del adorner también.

0

Mi solución fue empujar una región de recorte en el contexto de dibujo, hacer todo lo que necesitaba, y hacer estallar el recorte en el extremo, como esto:

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

Usted puede enchufar esto en cualquier Adorner, la los límites ya están disponibles como parte del elemento.