当键盘已经可见时,以编程方式将焦点设置为文本框

时间:2013-03-18 04:18:25

标签: windows-phone-7

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

当我点击复选框时,我想将焦点设置到它下面的文本框中。 这样工作正常,软键盘出现,屏幕向上滚动以显示键盘上方的文本框。

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

我猜这些事件彼此冲突 - TextBox失去焦点并隐藏键盘+向下滚动屏幕 - 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();
}

1 个答案:

答案 0 :(得分:0)

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

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