【问题标题】:Windows Phone XAML: How to prevent page from scrolling when keyboard slides inWindows Phone XAML:当键盘滑入时如何防止页面滚动
【发布时间】:2015-05-16 21:36:56
【问题描述】:

我想创建一个 Windows Phone 8.1 Silverlight/XAML UI,其中包含一个类似于 Cortana 中使用的搜索框。文本框应位于页面底部,并在获得焦点后使用键盘向上滚动。我页面的其余部分根本不应该移动。 Cortana UI 正是这样做的,但我无法在我的应用程序中重新创建该行为。我找到了需要在文本框获得焦点时手动调整我的 UI 容器大小的解决方案,但这需要估计键盘大小,它会随着不同的屏幕分辨率而变化,并且还会在内容恢复到位之前产生一个简短的动画。那么,当键盘滑入时,如何防止我的页面内容向上滚动呢?

【问题讨论】:

  • 对于“防止我的页面内容在键盘滑入时向上滚动”的部分,在 InputPane Showing 事件处理程序中设置 EnsuredFocusElementInView = true 可能是答案?然后对于滚动文本框的部分,您需要对键盘滚动动画的样条进行逆向工程/猜测。

标签: c# silverlight keyboard winrt-xaml windows-phone-8.1


【解决方案1】:

没有一个很好的方法来做到这一点。 Cortana 是系统 UI 和任何现有的应用程序空间。对于您的应用,假设您的应用中的任何 UI 都是整个应用的一部分。对于显示软件键盘的输入,应用程序内容会滚动到视图中,以确保不会丢失上下文。这是您无法真正改变的默认行为。

您确实可以访问键盘区域何时显示/隐藏 (Windows.UI.ViewManagement.InputPane.InputPaneShowing[Hiding]),并且可以知道被遮挡的矩形将是什么。使用这个事件你可以在那里做一些事情,但是只要你的 UI 是主视觉树的一部分,你的应用仍然会滚动。

您可以尝试的一件事是将该文本区域放在一个弹出层中,该层不是您的主应用程序 UI 的一部分(这意味着它与任何可视化树无关)。无父弹出窗口不参与主 UI 滚动行为。如果你这样做了,同时监听输入窗格何时显示/隐藏,你可能能够实现你想要的。

【讨论】:

  • 感谢您的回答!遗憾的是没有好的方法可以做到这一点,我真的很喜欢底部有盒子的布局,因为当你一只手拿着手机时,它真的很容易拿到。也许我会摆弄弹出层并在这里发布我的发现,但如果它太复杂我可能会改变我的布局。 ;)
  • “无父弹出窗口不参与主 UI 滚动行为”是什么意思?在 MainPage 之外并在 MainPage 内部使用的单独 UserControl 将使其“无父”?
【解决方案2】:

没有一种超级干净的方法可以做到这一点,但在 Silverlight 中仍有一些解决方法。当键盘打开时,它将为 RootApplicationFrame 上的 TranslateTransform 设置动画。因此,当您关注某个元素时,请为页面订阅 LayoutUpdates,并检查转换值。

在此处查看详细信息/代码:How to determine the keyboard offset

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多