我正在使用WPF和visual c#开发一个应用程序,我正在尝试实现一个允许在桌面上绘图的注释功能。
我目前实现这一目标的方法是制作一个具有透明背景的整个屏幕大小的窗口,并将其放在桌面上,允许我在这个不可见的窗口上“写”。 但是,我有另一组窗口构成屏幕上的各种浮动菜单,我希望这个菜单始终可以交互,即使用户正在注释(例如,这是我想要放置一些注释选项的地方)
然而,当我显示透明窗口时,我的菜单窗口都在它后面,这意味着我在这些窗口上绘制而不是点击它们。我已尝试过在菜单窗口中设置最顶层的东西,但这并没有将它们放在透明度上。
我现在的想法是从透明窗口中制作一个非矩形窗口,基本上只剪切浮动菜单所在的区域,如果用户将菜单拖动到屏幕上的另一个位置,则动态更新。这是可行/可行的,我如何动态地进行这些窗口更改?如果这是不可能的,有没有更好的方法强制我的所有菜单窗口始终在注释透明度的顶部?
编辑:作为补充说明,有没有办法在这些窗口上设置排序的z-index?我想,如果我可以将菜单窗口一直z-index到前面,然后将透明度索引到后面的那个,但是我无法找到一种方法来执行此操作。
编辑:有人评论并建议我在创建透明窗口后为菜单窗口重新设置topmost = true,但最终没有效果
最终编辑:我使用David Edey关于设置最顶层的建议来解决问题;结果我有一个流氓代码行将透明度设置为topmost = true,在设置窗口最顶层属性时导致此问题,但现在它就像一个魅力。非常感谢你的帮助!
答案 0 :(得分:0)
......构成浮动菜单的另一组窗口 屏幕,我希望这个菜单始终可以互动,
我的建议是将有问题的菜单窗口控件放入一个具有依赖项属性的控件中,该属性显示菜单的业务逻辑。确保上述属性与viewmodel上的INotify属性双向绑定,最终将通过注释窗口访问/共享。
当注释窗口出现时,它也创建自己的菜单窗口控件,它与注释窗口具有相同的zorder。旧的原始菜单被隐藏(?)或新的菜单出现在其位置(?)。
通过设计,新的菜单窗口属性也与共享VM双向绑定。因此,允许从注释菜单进行更改,以通过共享属性返回到原始窗口。
这个带有新控件的手,对于用户来说就像其他菜单控件一样,并且还为注释和原始动态动态更改数据。此外,第二个菜单没有您遇到的有问题的z顺序问题。
答案 1 :(得分:0)
我自己构建了一个副本版本,并设置:
Application.Current.MainWindow.Topmost = false;
Application.Current.MainWindow.Topmost = true;
将该窗口置于前面(请注意,您确实需要先进行错误调用才能实际刷新它...不完全确定为什么会发生这种情况,但它确实有效!):)
(显然将Application.Current.MainWindow
的来电替换为对菜单窗口的引用。)