首页 文章

在深层嵌套的可视树中拖放装饰器

提问于
浏览
0

我们有一个WPF应用程序,它在画布上有自定义窗口,而后者又包含自定义控件(包含自定义窗口的主画面也是自定义控件显示内容) . 所以基本上可视树看起来像这样(没有隐式Borders和其他东西):

- Windows
  - Canvas
    - WindowMgr
      - CustomWindow (maximized with z-index 0, functioning as background)
        - ScrollPresenter
          - CustomControl1
      - CustomWindow
        - ScrollPresenter
          - CustomControl2

现在我们需要从那些自定义控件相互拖放(通常从可移动窗口到背景窗口) . 要显示拖放装饰器,需要装饰元素和装饰图层 . 通常示例使用它们的grid或itemscontrol,并从同一元素获取adorner层 .

在此处执行相同操作不起作用,因为ScrollPreseneter / CustomWindows会剪切其内容,从而阻止您拖出窗口 . 现在我们走向可视树,直到我们找到根画布并将其用作装饰元素,但这看起来很脏(而且我们经历的并不是很强大) .

有关强大解决方案的任何建议吗?

1 回答

  • 1

    如果我正确地阅读了您的问题,并且您自己没有提及它,那么您可能正在寻找AdornerDecorator Class,它在可视化树中为其下方的元素提供了一个装饰层 .

    假设其名称 ScrollPresenter 来自ContentPresenter,值得注意的是,为了实现高级自定义控件,你可能希望用 AdornerDecorator 包围它们的 ContentPresenter ,就像Window Class一样,请参阅例如Don’t forget the AdornerDecorator以获得一个很好的实际工作场景,包括拖放操作 .

    也就是说,通过AdornerDecorator,您将确保所需的AdornerLayer包含在您的自定义控件中,因此无需通过在可视树中向上移动来检索它,例如:

    <ControlTemplate TargetType="{x:Type CustomWindow}">
         <Border ...>
             <Grid>
                 <AdornerDecorator>
                     <ScrollPresenter ... />
                 </AdornerDecorator>
             </Grid>
         </Border>
     </ControlTemplate>
    

    根据您的特定情况,您可能需要 AdornerDecorator 用于自定义窗口,自定义控件或两者 .

    有关装配体架构的更多详细信息,请参见Adorners Overview .

相关问题