0

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

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

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

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

可以以某种方式防止这种情况吗?

这是xaml和代码的简化版本

xml:

<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();
}
4

1 回答 1

0

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

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

于 2013-03-18T18:15:48.710 回答