Surface 2中是否有SurfacePopup控件?

时间:2012-03-21 16:35:37

标签: wpf popup touch pixelsense

过去几个月我们一直致力于针对Windows 7平板电脑的应用程序。所以我们已经将Surface 2 SDK用于大多数控件,并且它们都非常开心。

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

我发现第一个Surface SDK中有一个SurfacePopup,但我在Surface 2 SDK中找不到一个。他们摆脱了吗?是否有“最佳实践”方法?

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

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

this.EnableSurfaceInput();

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

有什么想法吗?他们都会张开双臂欢迎!

2 个答案:

答案 0 :(得分:0)

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

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

编辑:正如我刚刚发现的那样,这仅在弹出窗口最初打开时才有效。要在以后打开弹出窗口时使其工作,您不需要使用弹出窗口,而是使用弹出窗口的父窗口(请参阅this question)。

答案 1 :(得分:0)

为了丹尼尔和其他任何需要解决方案的人的利益,我会试着回想两年,然后解释我们是如何运作的。

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

我通过编写一个自定义控件来完成所有工作,该控件允许您将带有内容的控件放在XAML中,然后在需要时显示和隐藏它。当它显示时,它将其内容移动到包含窗口的装饰层中,当它被隐藏时,它将内容移回控件本身,这对用户是隐藏的。

害怕我不能再详细说明了,但据我所知,这是最终的解决方案;使用使用装饰层的自定义控件替换弹出窗口(效果不佳)。

希望有所帮助!