如何防止SIP隐藏文本框?

时间:2013-02-05 02:41:49

标签: windows-phone-8

我有一个WP8应用程序,其中一个页面顶部有一个文本框,另外几个控件,另外三个文本框,底部有两个切换开关。我在页面上使用了三个Telerik RadToggleSwitches,还有一个Telerik RadListPicker(列表中有3个项目)。

在代码隐藏中,当任何文本框获得焦点时,我创建一个带有两个按钮的ApplicationBar。其中一个按钮是Next,它将焦点移动到下一个文本框。当文本框失去焦点时,我隐藏了应用程序栏。

现在,问题。有时,看似完全随机,页面不会向上变换,以使文本框从SIP后面可见。 InputScope,BTW,是Number。我可以点击任何文本框,有时它会随着SIP变得可见而向上变换,有时则不会。即使只是来回点击文本框,我偶尔也会无法正常工作。

这是相关的代码隐藏。

void onSettingsLoaded(object sender, RoutedEventArgs e)
    {
        ApplicationBar = new ApplicationBar();
        ApplicationBar.IsVisible = false;
    }

    private void onTextGotFocus(object sender, System.Windows.RoutedEventArgs e)
    {
        CreateTxtAppBar();
        tb = sender as TextBox;
        tb.SelectAll();
    }

    private void CreateTxtAppBar()
    {
        ApplicationBar.Buttons.Clear();
        ApplicationBar.MenuItems.Clear();
        ApplicationBar.IsVisible = true;
        ApplicationBarIconButton btnNext = new ApplicationBarIconButton(new Uri("/Toolkit.Content/next.png", UriKind.Relative));
        ApplicationBarIconButton btnOK = new ApplicationBarIconButton(new Uri("/Toolkit.Content/appbar.check.png", UriKind.Relative));
        btnOK.Text = LStrings.OK;
        btnNext.Text = LStrings.Next;
        ApplicationBar.Buttons.Add(btnNext);
        ApplicationBar.Buttons.Add(btnOK);
        btnNext.Click += btnNext_Click;
        btnOK.Click += onBtnOKClick;
    }

    void btnNext_Click(object sender, EventArgs e)
    {
        switch(tb.Name)
        {
            case "tb1":
                this.Focus();
                tb2.Focus();
                break;

            case "tb2":
                tb3.Focus();
                break;

            case "tb3":
                tb4.Focus();
                break;

            default:
                tb1.Focus();
                break;
        }
    }

    private void onTextLostFocus(object sender, System.Windows.RoutedEventArgs e)
    {
        ApplicationBar.IsVisible = false;
        ApplicationBar.Buttons.Clear();
        ApplicationBar.MenuItems.Clear();
    }

正如你所看到的,我试图通过在需要改变焦点的地方坚持使用this.Focus()来实现它,但这并不是这样。有时我点击文本框并且没有变换,键盘会隐藏刚刚收到焦点的文本框 - 操作中没有其他控件。

有谁知道为什么会这样?我在WP7中没有看到这种行为,所以要么我很幸运,要么(更可能的是,因为我似乎找不到任何其他有这个问题的帖子)WP8有一个新问题。或者它可能是Telerik,因为这是我第一次使用它们,但我并不看好那个,因为我可以点击文本框而不会来自任何Telerik控件并重现问题。

以防万一重要,这是来自其中一个文本框的标记。它们基本上都是一样的:

                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition
                                Width="2*" />
                            <ColumnDefinition
                                Width="1*" />
                        </Grid.ColumnDefinitions>

                        <TextBlock
                            Grid.Column="0"
                            Text="{Binding Strings.Age, 
                                Source={StaticResource LocalStrings}}"
                            Style="{Binding Source={StaticResource TBStyle}}" />

                        <TextBox
                            Name="tb2"
                            Grid.Column="1"
                            Style="{StaticResource TxtStyle}"
                            GotFocus="onTextGotFocus"
                            LostFocus="onTextLostFocus"
                            Text="{Binding Age, 
                                Source={StaticResource Settings}, 
                                Mode=TwoWay}" />
                    </Grid>

这都在stackpanel中,而stackpanel位于scrollviewer中。

感谢您的时间 - 感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,花了一天时间找到修复方法。对我有用的解决方案:

删除

ApplicationBar.IsVisible = false; 

   private void onTextLostFocus(object sender, System.Windows.RoutedEventArgs e)
    {
      //ApplicationBar.IsVisible = false;

就我而言,我在IsVisibleonTextGotFocus()设置了onTextLostFocus()。从两个函数中删除它都可以解决问题。

我还没有完全解释它为什么有效。似乎该问题与页面未完全加载有关。 IsVisible的MSDN文档说:

This property cannot be accessed using XAML syntax. It can be accessed only when there is a page loaded.

并且,您可以在加载页面时设置IsVisible = false,在您的情况下设置onSettingsLoaded()