2009-09-03 2 views
7

У меня есть ItemsControl в ScrollViewer. Элементы в ItemsControl расширены до DataTemplate, которые в основном состоят из Adorner.WPF Adorner Clipping

Теперь проблема в том, что при прокрутке визуальные дети Adorner видны за пределами ScrollViewer. Допустим, я прокручиваю с горизонтального смещения 0 до 100, визуальные дети Adorner перемещаются влево и видны рядом с ScrollViewer, хотя они должны быть скрыты. Установка ClipToBounds на ItemsControl или ScrollViewer не работает.

Я понимаю, что Adorner визуализируются над всеми элементами z-порядка, но они действительно не должны быть видны в таких случаях, как с ScrollViewer. Украшенный Element кстати ведет себя как ожидаемый и не виден через ScrollViewer.

Есть ли простой способ «закрепить» Adorner s, чтобы они были видны только в видимой области прокрутки?

Спасибо, Андрей

+2

Какая версия .NET/WPF сделала это для вас? Я на самом деле пытаюсь воссоздать это поведение, и я не могу. В основном, я хочу, чтобы мои обработчики ошибок отображались за границами scrollviewer (без использования всплывающего окна) –

ответ

2

Я столкнулся с той же проблемой, когда подклассов WPFToolkit DataGrid нарисовать Adorner вокруг текущей ячейки.

Содержимое ScrollViewer визуализируется экземпляром ScrollContentPresenter. ScrollContentPresenter имеет свой собственный слой adorner, доступный через свойство ScrollContentPresenter.AdornerLayer.

Я обнаружил, что мой Adorner правильно закрепил, добавив его к этому слою.

+0

Как вы получите ScrollContentPresenter из кода? – stone

+0

Я использую VisualTreeHelper для поиска визуального дерева, пока не найду потомка типа ScrollContentPresenter. Взгляните на метод в этом потоке - http://wpf.codeplex.com/Thread/View.aspx?ThreadId=34542. – hwiechers

5

Установка ClipToBounds на содержащийся элемент управления недостаточно. Вы также должны установить свойство IsClipEnabled у adorner.

0

Моего решения было протолкнуть вырезанную область на контекст рисования, делает все, что мне было нужно, и попы вырезки в конце, как это:

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

Вы можете подключить это в любой Adorner, то границы уже доступны как часть элемента.

 Смежные вопросы

  • Нет связанных вопросов^_^