窗口外的 WPF 装饰层

标签 wpf adorner

我有一个带有文本框控件的 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>

最佳答案

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

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

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

关于窗口外的 WPF 装饰层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34045111/

相关文章:

wpf - XAML 边框与矩形

WPF:装饰 ViewModel?

c# - "adorn objects with functionality"的最佳方法是什么?

c# - 创建一个覆盖层以禁用所有其他表单元素

c# - 无法与装饰层上的项目交互

wpf - 使用 MVVM 绑定(bind) WPF 菜单 - 查找错误

WPF - 配置自定义事件以触发用户控件上的开始 Storyboard

c# - 在 WPF ListView 中逐项滚动

c# - GetAdornerLayer 神秘地返回 null

wpf - 如何集成测试 WPF 应用程序