gpt4 book ai didi

wpf - WPF上下文菜单怎么可能显示在窗口外?

转载 作者:可可西里 更新时间:2023-11-01 14:41:18 25 4
gpt4 key购买 nike

据我了解,与旧的 Windows 窗体应用程序不同,WPF 应用程序中的控件未绑定(bind)到系统“窗口”资源(例如,您无法使用 Spy++ 找到它们的句柄)。

那么,这些菜单的一部分怎么可能显示在父窗口之外呢? 为什么它们不在到达窗口边界时立即剪掉?

当然,一种可能性是它们不是真正的 WPF 菜单,而是标准的 Windows 资源。然而,这与我可以像任何其他 WPF 控件一样设置其中一个菜单的样式这一事实相冲突,并且快速查看系统消息日志似乎可以确认,据 Windows 所知,它们实际上是,完全相同的资源,具有完全相同的句柄。

然后,我走得更远。我对菜单应用了旋转:

<Style TargetType="{x:Type ContextMenu}">
<Setter Property="RenderTransformOrigin" Value="0.5,0.5" />
<Setter Property="RenderTransform">
<Setter.Value>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-18.435"/>
<TranslateTransform/>
</TransformGroup>
</Setter.Value>
</Setter>
</Style>

这是一个相当有趣的结果:

Menu gets clipped in a rectangle

那么,这是怎么回事?

最佳答案

如果您在网上搜索 WPF 上下文菜单,您会发现很多文章都指出 ContextMenu 不属于与其父项相同的可视化树

它们不是实际窗口的一部分,它们托管在单独的窗口中。就像您可以在 WPF 中让多个窗口相互重叠一样。 ContextMenu 和 Popup 也是如此。

ContextMenu 只是一个 Popup。如果您有兴趣查看负责处理它的实际类,请查看 PresentationFramework.dll 中的 System.Windows.Controls.Primitives.Popup 类。每当打开上下文菜单时,都会调用方法 CreateWindow

并在关闭时调用 DestroyWindow 方法来销毁为托管 ContextMenu 内容而创建的弹出窗口。

因此,无论何时在包装下打开/关闭上下文菜单,都会创建和销毁一个窗口,这显然不是主窗口的一部分,而是一个完全独立的窗口,可以超出主窗口边界。

关于wpf - WPF上下文菜单怎么可能显示在窗口外?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21510292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com