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的界限(不使用弹出窗口),这是我最好的解决方案。