WPF装饰剪裁

WPF装饰剪裁,wpf,clipping,adorner,Wpf,Clipping,Adorner,我在滚动查看器中有一个ItemsControl。ItemsControl中的项被扩展为一个DataTemplate,它基本上由一个装饰器组成 现在的问题是,当滚动时,装饰程序的可视子项在滚动查看器外部可见。假设我从水平偏移量0滚动到100,装饰器的可视子项向左移动,并且在滚动查看器旁边可见,尽管它们应该隐藏。在ItemsControl或ScrollViewer上设置cliptobunds不起作用 我知道,Adorner是按z顺序呈现在所有元素之上的,但在使用ScrollViewer的情况下,它们

我在滚动查看器中有一个
ItemsControl
ItemsControl
中的项被扩展为一个
DataTemplate
,它基本上由一个
装饰器组成

现在的问题是,当滚动时,
装饰程序的可视子项在
滚动查看器
外部可见。假设我从水平偏移量0滚动到100,
装饰器的可视子项向左移动,并且在
滚动查看器旁边可见,尽管它们应该隐藏。在
ItemsControl
ScrollViewer
上设置
cliptobunds
不起作用

我知道,
Adorner
是按z顺序呈现在所有元素之上的,但在使用
ScrollViewer
的情况下,它们确实不应该可见。顺便说一下,修饰的
元素的行为与预期的一样,在
滚动查看器中不可见

是否有任何简单的方法“剪裁”装饰条,使其仅在可见滚动区域可见

谢谢,
Andrej

在对WPFToolkit数据网格进行子类化以在当前单元格周围绘制装饰器时,我遇到了相同的问题

ScrollViewer的内容由ScrollContentPresenter实例呈现。ScrollContentPresenter有自己的装饰器层,可以通过ScrollContentPresenter.AdornerLayer属性访问该层


我发现,如果我将装饰器添加到该层,它将正确剪辑。

在包含控件上设置
cliptobunds
是不够的。您还必须设置装饰器的
IsClipEnabled
属性。

我的解决方案是将剪辑区域推到绘图上下文中,渲染所需的内容,并在末尾弹出剪辑,如下所示:

drawingContext.PushClip(新矩形几何体(新矩形(0,0,this.AdornedElement.RenderSize.Width,this.AdornedElement.RenderSize.Height));
//继续绘制
drawingContext.Pop();

您可以将其插入任何装饰器中,边界已作为元素的一部分提供。

我使用VisualTreeHelper搜索可视树,直到找到ScrollContentPresenter类型的后代。看看这个线程中的方法-。在下面的线程中,Wei Zhou重新模板了ScrollViewer,因此按钮的装饰器受到约束。在.NET/WPF的哪个版本中发生了这种情况?我实际上是在试图重现这种行为,但我做不到。基本上,我希望我的错误装饰器显示超过scrollviewer的界限(不使用弹出窗口),这是我最好的解决方案。