我们有一个WPF应用程序,它在画布上有自定义窗口,而后者又包含自定义控件(包含自定义窗口的主画布也是自定义控件显示内容)。所以基本上可视化树看起来像这样(没有隐式边框和其他东西):
- Windows
- Canvas
- WindowMgr
- CustomWindow (maximized with z-index 0, functioning as background)
- ScrollPresenter
- CustomControl1
- CustomWindow
- ScrollPresenter
- CustomControl2
现在我们需要将这些自定义控件拖放到彼此(通常从可移动窗口到背景窗口)。要显示拖放装饰器,需要装饰元素和装饰层。通常示例使用它们的grid或itemscontrol,并从同一元素中获取adorner层。
此处执行相同操作无效,因为ScrollPreseneter / CustomWindows会剪切其内容,从而阻止您拖出窗口。现在我们走向可视树,直到我们找到根画布并将其用作装饰元素,但这看起来很脏(而且我们经验不是很强大)。
有关此问题的强有力解决方案的任何建议吗?
答案 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。