0

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

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

现在我们需要从这些自定义控件相互拖放(通常是从可移动窗口到背景窗口)。要显示拖放装饰器,需要一个装饰元素和一个装饰层。通常示例使用它们的网格或项目控件,并且还从同一元素获取装饰层。

在这里做同样的事情是行不通的,因为 ScrollPreseneter/CustomWindows 剪辑了它们的内容,这会阻止你拖出窗口。现在,我们沿着可视化树向上走,直到找到根画布并将其用作装饰元素,但这似乎有点脏(而且正如我们所经历的那样,它不是很健壮)。

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

4

1 回答 1

1

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

假设它的名称ScrollPresenter源自ContentPresenter,值得注意的是,为了实现高级自定义控件,您可能希望将它们用 包围ContentPresenterAdornerDecorator就像这样Window Class做一样,请参见例如不要忘记 AdornerDecorator以获得一个不错的实际工作场景,也涉及拖放.

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

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

根据您的特定场景,您可能需要AdornerDecorator自定义窗口、自定义控件或两者兼而有之。

有关装饰器架构的更多详细信息,请参阅装饰器概述

于 2009-09-08T17:43:29.483 回答