2012-05-02 57 views
10

我正在處理包含註冊表單的應用程序。該表單包含多個文本輸入框,因此ScrollViewer可用於將它們全部顯示在一個頁面上。滾動查看器和SIP問題(WP7.5芒果)

以下是XAML代碼的剝離下來例如我使用:

<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 
     <TextBlock x:Name="ApplicationTitle" Text="SCROLLVIEWER TEST" Style="{StaticResource PhoneTextNormalStyle}"/> 
     <TextBlock x:Name="PageTitle" Text="registration" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
    </StackPanel> 

    <ScrollViewer Grid.Row="1"> 
     <StackPanel> 
      <TextBlock Text="Hello" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="Hello1" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="Hello2" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="Hello3" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="Hello4" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="Hello5" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="Hello6" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="Hello7" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="Hello8" Margin="12,0,0,0"/> 
      <TextBox /> 
      <TextBlock Text="END" Margin="12,0,0,0"/> 
      <TextBox /> 
     </StackPanel> 
    </ScrollViewer> 
</Grid> 

(注意的ScrollViewer是一個網格單元內,這意味着該標題面板應始終留在屏幕上)

滾動工作得很好,所以這不是問題。但是,當用戶選擇文本框輸入數據(即打開軟鍵盤)時,系統會推送整個頁面的內容(包括註冊標題面板),這不是預期的行爲。 [請參閱Windows Phone上的人員應用並嘗試添加新聯繫人。這包含了類似的結構,但ScrollViewer中僅在ScrollViewer中了]

測試用例

  • 選擇一個文本框是靠近屏幕的上方顯示內容推送正確的行爲,開鍵盤。
  • 嘗試在打開鍵盤的情況下滾動到頁面的底部。
  • 頁面底部的項目無法訪問。

  • 選擇一個文本框是靠近屏幕的底部可見。
  • 整個頁面的內容被推高。
  • 嘗試在打開鍵盤的情況下滾動到頁面的頂部。
  • 頁面頂部的項目無法訪問,並且在鍵盤關閉之前,標題面板不會再回到視圖中。

任何幫助解決這個問題,將不勝感激。謝謝。

+0

以下博客文章可能是解決此問題的好起點:http://sorokoletov.com/2011/08/windows-phone-70-handling-text-entry-screens/ –

+0

@PaulDiston謝謝。我以前閱讀過這個博客。我曾嘗試演示應用程序,這不是我正在尋找的。過渡是非常突然的(即當SIP動畫結束時標題面板會重新出現),更不用說實施過於簡單了。我的預期實施方式是匹配您在Windows Phone 7中包含的用於管理聯繫人和地址的「People」應用程序中找到的聯繫人詳細信息表單。這並不是一個複雜的例子,人們可能會希望這個功能可以直接使用,不會覆蓋表單中的項目。 –

+0

如果它可以幫助解決滾動問題,也試試這個。 http://www.luisleo.net/2012/06/24/how-to-use-listbox-properly-with-windows-phone-7/ –

回答

0

問題是ScrollViwer的高度在鍵盤出現後沒有被修改,因此它會被剪切掉。一種解決方案是修改scrollviwer的高度(根據鍵盤高度),然後重新定位(這可能會讓你頭痛)。

另一個問題是知道鍵盤何時出現 - 您可以在所有文本框中註冊GotFocus/LostFocus事件,但這不是一個好的解決方案。這可以幫助你:http://blogs.msdn.com/b/jaimer/archive/2010/11/05/guessing-if-the-sip-is-visible-in-a-windows-phone-application.aspx

希望這有助於一點:)

+0

聽起來像似是而非的黑客攻擊。但是,只有當您在屏幕頂部選擇一個框時(當滾動查看器底部的內容被遮擋時),這才起作用。 屏幕上的文本框物理位置會影響頁面被推高的程度。因此,如果它位於頂部,則內容只會略微提升。如果它處於最底層,內容會被推高很多。據我所知,不可能確定頁面調整了多少,這意味着很難對此進行整理。此外,標題窗格將繼續推出屏幕,這並不理想。 –

+0

謝謝你的建議。 :) –

0

我認爲你可以從另一個角度來問題,解決這個問題。手機將向上滾動頁面,以便SIP(軟件鍵盤)永遠不會覆蓋具有焦點的文本框。

但是,您可以通過檢測ScrollViewer中包含的頂層元素上的觸摸事件來強制隱藏SIP,例如,:

<ScrollViewer Grid.Row="1"> 
    <StackPanel ManipulationDelta="OnScrollViewerGridManipulationDelta">` 

然後,通過將焦點置於隱藏按鈕(大小爲0x0像素),這將強制SIP關閉。然後,將有可能爲您的用戶和上下滾動按預期的ScrollViewer ...

private void OnScrollViewerGridManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e) 
    { 
     // This will hide the SIP if it is currently showing. 
     // We can't do this directly, but we can force this by taking focus away from any of the TextBoxes that may have it. 
     this.hiddenButton.Focus(); 
    } 
+0

您可以在後面的代碼中調用this.Focus()以將焦點置於頁面上以隱藏SIP。沒有必要創建一個額外的隱藏對象。 – Styff

0

我有同樣的問題與我已經開發了一個應用程序,我處理的方式是找出包含輸入textbox s的面板的自動高度,然後手動設置高度並在底部添加大約400 - 500 px以使其滾動很好。效果非常流暢,不會讓你的UI看起來像「hackish」的恕我直言。

你的情況,你將不得不找出LayoutRoot的自動高度Grid,然後在第1行的RowDefinition手動設置的高度 - 記住要添加一個額外的400像素(或任何看起來合適您的情況)。

爲便於輸入,我隨後處理了每個TextBox的每個OnKeyDown事件,以便在達到Enter時將焦點更改爲下一個TextBox。在最後的TextBox我將焦點設置爲this.focus(),它將焦點設置爲頁面並隱藏了SIP。

0

看一看我的小圖書館請 - https://siphelper.codeplex.com/

它修改的ScrollViewer和內容的高度可以滾動到最上面/最下面的點。

如果您有任何建議 - 請隨時與我聯繫。