WPF修饰器剪裁

10

我在一个ScrollViewer中有一个ItemsControlItemsControl 中的项会扩展到一个DataTemplate,其基本上由一个Adorner组成。

现在的问题是,当滚动时,Adorner的可视子元素会显示在ScrollViewer之外。假设我从水平偏移量0滚动到100,Adorner的可视子元素向左移动,并且在ScrollViewer旁边可见,尽管它们应该被隐藏。在ItemsControlScrollViewer上设置ClipToBounds不起作用。

我知道Adorner按z顺序呈现在所有元素的上方,但它们在ScrollViewer等情况下实际上不应该可见。顺便说一下,被装饰的Element的行为符合预期,并且不能通过ScrollViewer看到。

有没有简单的方法可以“裁剪”Adorner,使它们仅在可见的滚动区域中可见?

谢谢, 安德烈


在下面的线程中,周伟重新定义了 ScrollViewer,以使按钮的 Adorner 受到限制。[实现选择高亮-请给建议] (http://social.msdn.microsoft.com/forums/en-US/wpf/thread/e060205e-5bfc-4f21-bf80-dfa55c44eb8a) - David Hollinshead
3
这件事情发生在哪个.NET/WPF版本?我正在尝试重现这种行为,但一直无法成功。基本上我希望我的错误装饰器可以显示在滚动视图的边界之外(不使用弹出窗口)。 - Chris Nicol
3个回答

11

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


这对我来说是最好的解决方案。 - stigzler

2

当我继承WPFToolkit DataGrid以在当前单元格周围绘制装饰时,我也遇到了同样的问题。

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

我发现如果将装饰添加到该层中,则我的装饰正确地剪切。


我使用VisualTreeHelper搜索可视树,直到找到ScrollContentPresenter类型的后代。请参考此线程中的方法 - http://wpf.codeplex.com/Thread/View.aspx?ThreadId=34542。 - hwiechers

1
我的解决方案是将一个剪辑区域推入绘图上下文中,渲染所需内容,最后弹出剪辑区域,代码如下:
drawingContext.PushClip(new RectangleGeometry(new Rect(0, 0, this.AdornedElement.RenderSize.Width, this.AdornedElement.RenderSize.Height)));
// continue drawing
drawingContext.Pop();

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


如果你正在将内容渲染到文本框或者带有滚动条的控件中,你可以使用ViewportWidth和ViewportHeight代替RenderSize。但是对于文本框,你可能需要将ViewportWidth增加4,因为存在一些奇怪的填充。 - REghZY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接