【问题标题】:WPF Adorner Layer Outside Window窗口外的 WPF 装饰层
【发布时间】:2015-12-02 14:23:11
【问题描述】:

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

正如您在下面的屏幕截图中所见,装饰器仅限于窗口的边界。我怎样才能让它显示完整的装饰器?

装饰模板是:

<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>

【问题讨论】:

    标签: wpf adorner


    【解决方案1】:

    这是不可能的。 AdornerLayer 限制在 AdornerDecorator 的范围内(Window 有一个,如果您还没有定义一个),所以不可能超出该装饰器的范围。

    您可以使用定义弹出窗口的Popup (MSDN) 获得您想要的东西,但绝对不能使用装饰器。主要区别在于弹出窗口不是窗口可视树的一部分,因此它不会随之移动或调整大小。

    如果您想要在桌面上显示效果(例如您正在显示的投影),您还可以定义自己的弹出窗口。这确实很棘手,但可行。通过大量工作,您也可以使其与窗口一起移动和调整大小(从而模拟“窗外装饰器”),但这绝对不会快速或易于编码(尽管对于普通的Popup,你可以挂上你的WindowSizeChangedLocationChanged 事件并相应地移动)

    【讨论】:

    • 谢谢。我开始怀疑可能是这种情况。在之前的尝试中,我曾尝试使用 Popup,但我喜欢装饰层方法的地方在于它确实随控件/窗口移动。
    • 您可以挂钩窗口的SizeChanged/LocationChanged 事件(考虑到实际的文本框希望不会移动!)并相应地移动Popup。这不应该那么难! :-)
    • 看看这个库中的 PopupEx。它解决了有关移动/调整大小的问题。 github.com/ControlzEx/ControlzEx
    • @JamesWillock 这些天我没有在做 WPF,但这绝对看起来很有用。我记得我做了各种技巧来让它完美地工作:-)
    • 作为参考,我最终按照建议使用了弹出窗口
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多