2013-02-05 56 views
1

我有一個WP8應用程序,其頂部有一個文本框,一對其他控件,另外三個文本框以及底部的兩個切換開關。我在頁面上使用了三個Telerik RadToggleSwitches,還有一個Telerik RadListPicker(列表中的三個項目)。如何讓SIP隱藏文本框?

在代碼隱藏中,當任何文本框獲得焦點時,我創建一個帶兩個按鈕的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> 

這是全部在一個堆棧面板內,並且該堆棧面板在一個滾動查看器內。

感謝您的時間 - 任何幫助表示讚賞。

+0

那麼,我最終通過在構造函數中創建應用欄並禁用按鈕來解決問題。當一個文本框獲得焦點時,我啓用這些按鈕,當它失去焦點時,我禁用這些按鈕。這不是我想要的效果,但它解決了SIP覆蓋的焦點文本框的問題。 –

+0

我在wp8上面臨類似的問題。 – db42

回答

0

我面臨類似的問題,並花了一天的時間找到解決辦法。爲我工作的解決方案:

刪除

ApplicationBar.IsVisible = false; 

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

在我來說,我在onTextGotFocus()onTextLostFocus()設置IsVisible。從兩個函數中刪除這個訣竅。

我還沒有得到充分的解釋,爲什麼它的工作。看來這個問題與頁面沒有完全加載有關。爲IsVisible MSDN文檔說:

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

而且,您可以設置IsVisible = false頁面時你的情況被加載時,onSettingsLoaded()