1

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

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

现在,问题。有时,看似完全随机,页面不会向上转换以使文本框从 SIP 后面可见。InputScope,顺便说一句,是数字。我可以点击任何文本框,有时它会随着 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>

这一切都在堆栈面板中,而堆栈面板在滚动查看器中。

感谢您的宝贵时间 - 感谢您提供任何帮助。

4

1 回答 1

0

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

消除

ApplicationBar.IsVisible = false; 

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

就我而言,我正在IsVisible设置onTextGotFocus()and onTextLostFocus()。从这两个函数中删除它就可以了。

我仍然没有完全解释它为什么起作用。似乎该问题与页面未完全加载有关。MSDN 文档IsVisible说:

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

而且,根据您的情况,您可以设置IsVisible = false页面何时加载onSettingsLoaded()

于 2013-03-19T11:46:29.250 回答