曲面2中是否有SurfacePopup控件



在过去的几个月里,我们一直在开发一款针对Windows7平板电脑的应用程序。因此,我们在大多数控件中都使用了Surface 2 SDK,这一切都很令人满意。

不过,我最近注意到,我们的一个自定义控件无法正常工作。此控件提供弹出菜单,这些都是通过Popup控件实现的。在开发者的笔记本电脑上,这很好用,当你点击离开菜单时,菜单就会消失。不过,我注意到,在我们的测试平板电脑上,它们有保持开放的趋势。

我发现在第一个Surface SDK中有一个SurfacePopup,但在Surface 2 SDK中找不到。他们把它扔掉了吗?是否有"最佳实践"方法?

如果没有简单的解决方案,我可能不得不老派,在菜单出现时在菜单下方添加一个窗口大小的隐藏SurfaceButton,当点击或触摸时,它会隐藏自己和菜单。

除此之外,我注意到弹出窗口中的SurfaceScrollViewer有时无法工作。我猜这是因为它没有正确地拾取触摸事件。我尝试将此扩展方法添加到窗口中。。

this.EnableSurfaceInput();

但我在System.Windows.Input.Mouse.get_LeftButton()上得到了一个NullReferenceException,它奇怪地表明,它只能在插入鼠标时为控件启用表面输入。

有什么想法吗?他们都将受到热烈欢迎!

Surface SDK 2.0中没有SurfacePopup,但您可以使用普通的WPF弹出窗口。然后,您需要确保它通过使用您在弹出窗口上建议的扩展方法接收触摸事件,而不是窗口

((HwndSource)HwndSource.FromVisual(popup)).EnableSurfaceInput();

编辑:正如我刚刚发现的,只有当弹出窗口最初打开时,这才有效。当弹出窗口稍后打开时,要使其工作,您不需要使用弹出窗口,但需要使用其子窗口的父窗口(请参阅此问题)。

为了Daniel和其他需要解决方案的人的利益,我将试着回顾两年前的情况,并解释我们是如何做到这一点的。

据我记忆所及,答案是使用装饰层而不是弹出窗口。基本上,每个WPF控件都有一个装饰层,位于控件的UI堆栈之上。默认情况下,它不包含任何内容,但你可以添加任何你喜欢的内容

我通过编写一个自定义控件实现了这一切,该控件允许您将该控件和内容一起放置在XAML中,然后在需要时显示和隐藏它。当它显示时,它将其内容移动到包含窗口的装饰层中,当它隐藏时,它会将内容移回控件本身,而控件本身对用户是隐藏的。

恐怕我不能再详细介绍了,但据我记忆所及,这是最终的解决方案;用使用adorner层的自定义控件替换弹出窗口(从来没有很好地工作过)。

希望能有所帮助!

最新更新