【问题标题】:Programmatically setting focus to textbox when the keyboard is already visible当键盘已经可见时,以编程方式将焦点设置到文本框
【发布时间】:2013-03-18 04:18:24
【问题描述】:

我有一个页面,底部有两个文本框、一个复选框和另外两个文本框。

当我单击复选框时,我想将焦点设置到它下面的文本框。 这很好用,软键盘出现,屏幕向上滚动以显示键盘上方的文本框。

但是,如果 TextBox1 或 TextBox2 当前处于焦点状态且键盘已显示,则通过 CheckBox_Click 事件设置焦点将重置屏幕并向下滚动。

我猜这些事件相互冲突 - 文本框失去焦点并隐藏键盘 + 向下滚动屏幕 - TextBox 从外部获得焦点并显示键盘(但不会向上滚动屏幕)

能以某种方式防止这种情况发生吗?

这是 xaml 和代码的简化版本

xaml:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel Margin="0,100,0,0">
        <TextBox x:Name="TextBox1" />
        <TextBox x:Name="TextBox2" />
        <CheckBox Content="Click Me" Click="CheckBox_Click" />
        <TextBox x:Name="TextBox3" />
        <TextBox x:Name="TextBox4" />
    </StackPanel>
</Grid>

后面的代码:

private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    TextBox3.Focus();
}

【问题讨论】:

  • 嗯,第一件事,你应该注意:你的 CheckBox_click 事件不控制复选框是否已经被选中。而且我看不到,这是怎么发生的:CheckBox_Click 事件将重置屏幕并向下滚动在您的示例中看不到任何滚动。你没有错过什么吗?

标签: windows-phone-7


【解决方案1】:

您遇到的问题是,当焦点位于不在可滚动容器中且被 SIP 遮挡的控件上时,操作系统会尝试移动页面。

我已通过将所有内容放入ScrollViewer 并根据所选控件以及是否显示 SIP 调整VerticalScrollOffset 来解决此问题。这是很多非常混乱、繁琐的代码。在开始之前问问自己移动焦点是否值得付出努力,因为没有简单的解决方案。

【讨论】:

  • 谢谢马特。我通过绑定到 Frame 的 Y Translate 值(在 SIP 显示/隐藏时更改)并在键盘不再显示时使用标志来设置焦点,做了另一个解决方法。有一些键盘向下滑动并再次备份的时髦动画。从这里得到想法:sorokoletov.com/2011/08/…
猜你喜欢
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多