WPF修饰层位于窗口之外

20

我有一个带有文本框控件的WPF窗口。当文本框具有键盘焦点时,该控件会显示装饰器。

如下面的屏幕截图所示,装饰器受限于窗口的边界。如何使整个装饰器都显示出来?

enter image description here

装饰器模板为:

<DataTemplate x:Key="ContextualInfoDataTemplate">
    <Border 
        Background="#E1E1E1" 
        CornerRadius="6"
        Margin="50,36,0,0">
        <Border.Effect>
            <DropShadowEffect/>
        </Border.Effect>
        <Grid Width="200" Margin="4,3,4,4">
            <TextBlock TextWrapping="Wrap" Text="OverridenAutomationId"/>
        </Grid>
    </Border>
</DataTemplate>
1个回答

7
这是不可能的。 AdornerLayer 受限于 AdornerDecorator 的边界内(如果你没有定义,则 Window 有一个),因此无法超出该装饰器的边界。
您可以使用 PopupMSDN)来实现您想要的效果,它定义了一个弹出窗口,但绝不使用 adorner。主要区别在于弹出窗口不是窗口的可视树的一部分,因此不会随着窗口移动或调整大小。
如果您想要效果超出桌面范围(例如您正在显示的投影),则还可以定义自己的弹出窗口。这确实很棘手,但是可行的。通过大量工作,您可以使其随窗口一起移动和调整大小(从而模拟“超出窗口的装饰器”),但这肯定不是快速或易于编码的过程(对于普通的 Popup,您只需钩住您的 WindowSizeChangedLocationChanged 事件并相应地移动即可)。

谢谢。我开始怀疑可能是这种情况。在之前的尝试中,我曾尝试使用弹出窗口,但我喜欢装饰层方法的原因是它可以随着控件/窗口移动。 - David Ward
1
你可以挂钩窗口的 SizeChanged/LocationChanged 事件(考虑实际文本框不会移动!),并相应地移动 Popup。这应该不难! :-) - Jcl
1
请查看此库中的PopupEx。它解决了有关移动/调整大小的问题。https://github.com/ControlzEx/ControlzEx - James Willock
@JamesWillock 我现在不做WPF了,但那绝对看起来很有用。我记得当时为了让它完美运行,我尝试了各种各样的技巧。 :-) - Jcl
2
参考建议,我最终使用了弹出窗口。 - David Ward
我在实现WPF的“Adorner”进行拖放后来到这里,意识到它不适用于在窗口或甚至ListView之间拖动,因为上述问题。我最终构建了自己的窗口并跟踪位置 - 这并不是那么疯狂:花费的时间比阅读和理解所谓的“首选”MS方法还要少。 - mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接