我有一个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中。
感谢您的时间 - 感谢任何帮助。
答案 0 :(得分:0)
我遇到了类似的问题,花了一天时间找到修复方法。对我有用的解决方案:
删除
ApplicationBar.IsVisible = false;
这
private void onTextLostFocus(object sender, System.Windows.RoutedEventArgs e)
{
//ApplicationBar.IsVisible = false;
就我而言,我在IsVisible
和onTextGotFocus()
设置了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()
。