过去几个月,我们一直在开发一款针对Windows7平板电脑的应用程序。因此,我们在大多数控件中都使用了Surface 2 SDK,而且它都是触摸式的。
不过,我最近注意到,我们的一个自定义控件不能正常工作。此控件提供弹出菜单,这些菜单是通过Popup控件实现的。在开发人员的笔记本电脑上,这可以很好地工作,当您离开菜单时,菜单就会消失。不过,我注意到,在我们的测试平板电脑上,它们有保持开放的趋势。
我发现在第一个Surface SDK中有一个SurfacePopup,但在Surface 2SDK中找不到一个。他们把它处理掉了吗?有没有“最佳实践”的方法?
如果没有简单的解决方案,我可能不得不老办法,当菜单出现时,在菜单下面添加一个窗口大小的隐藏SurfaceButton,当点击或触摸时,它会隐藏自身和菜单。
除此之外,我还注意到有时弹出窗口中的SurfaceScrollViewer不起作用。我猜这是因为它没有正确地拾取触摸事件。我尝试将此扩展方法添加到窗口中。
this.EnableSurfaceInput();..but我在System.Windows.Input.Mouse.get_LeftButton()上得到了一个NullReferenceException,奇怪的是,它只能在插入鼠标的情况下启用控件的表面输入。
有什么想法吗?他们都会张开双臂受到欢迎!
发布于 2014-02-26 19:19:50
为了Daniel和其他需要解决这个问题的人的利益,我将试着回顾两年前的情况,并解释我们是如何实现这一目标的。
据我所知,答案是使用装饰层而不是弹出窗口。基本上,每个WPF控件都有一个装饰层,它位于控件的UI堆栈之上。默认情况下,它不包含任何内容,但您可以向其中添加任何您喜欢的内容。
我编写了一个自定义控件,允许您将带有内容的控件放在XAML中,然后根据需要显示和隐藏它,从而实现了这一切。当它被显示时,它将其内容移动到包含窗口的装饰层中,当它被隐藏时,它将内容移回对用户隐藏的控件本身。
恐怕我不能深入到更多的细节,但据我所知,这是最终的解决方案;用一个使用装饰层的自定义控件替换弹出窗口(它从来没有很好地工作过)。
希望这能有所帮助!
发布于 2014-02-24 18:15:45
Surface SDK2.0中没有SurfacePopup,但是你可以使用一个普通的WPF弹出窗口。然后,您需要确保它通过使用您在弹出窗口上的上面建议的扩展方法来接收触摸事件,而不是窗口
((HwndSource)HwndSource.FromVisual(popup)).EnableSurfaceInput();
编辑:正如我刚刚发现的,这只在弹出窗口最初打开时才起作用。要让它在稍后打开弹出式窗口时工作,您不需要使用弹出式窗口,而是它的子级的父级(请参阅this question)。
https://stackoverflow.com/questions/9808912
复制相似问题