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

时间:2009-06-18 12:58:57

标签: c# wpf drag-and-drop nested adorner

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

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

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

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

有关此问题的强有力解决方案的任何建议吗?

1 个答案:

答案 0 :(得分:1)

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

假设其名称ScrollPresenter来自ContentPresenter,值得注意的是,为了实现高级自定义控件,您可能希望将ContentPresenter括起来AdornerDecorator,就像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