【问题标题】:WPF Adorner ClippingWPF 装饰器剪辑
【发布时间】:2010-11-25 05:55:35
【问题描述】:

我在ScrollViewer 中有一个ItemsControlItemsControl 中的项目扩展为 DataTemplate,它基本上由 Adorner 组成。

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

我了解,Adorner 以 z 顺序呈现在所有元素之上,但在 ScrollViewer 这样的情况下,它们确实不应该可见。顺便说一句,装饰的Element 的行为与预期的一样,并且通过ScrollViewer 是不可见的。

有什么简单的方法可以“剪辑”Adorners,使它们只在可见滚动区域中可见?

谢谢, 安德烈

【问题讨论】:

  • 在下面的线程中,Wei Zhou 重新模板化了 ScrollViewer,因此按钮的 Adorner 受到约束。 Implement selection highlighting - advice please
  • 您遇到了哪个版本的 .NET/WPF?我实际上正在尝试重新创建这种行为,但我做不到。基本上我希望我的错误装饰器显示超出滚动查看器的边界(不使用弹出窗口)

标签: wpf clipping adorner


【解决方案1】:

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

【讨论】:

  • 这对我来说是最好的解决方案。
【解决方案2】:

在子类化 WPFToolkit DataGrid 以在当前单元格周围绘制装饰器时,我遇到了同样的问题。

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

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

【讨论】:

【解决方案3】:

我的解决方案是将剪辑区域推送到绘图上下文中,渲染我需要的任何内容,然后在最后弹出剪辑,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 2016-11-24
    • 1970-01-01
    • 2010-11-24
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多