2012-05-02 2 views
10

Я работаю над приложением, которое включает регистрационную форму. Форма содержит несколько текстовых полей ввода, поэтому ScrollViewer используется для того, чтобы все они отображались на одной странице.Scrollviewer & SIP Issue (WP7.5 Mango)

является разобранным примером кода 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 находится внутри ячейки сетки, что означает, что название панель должна оставаться OnScreen во все времена)

Прокрутка работает отлично, так что это не проблема. Однако, когда пользователь выбирает TextBox для ввода данных (т. Е. Открывается мягкая клавиатура), система подталкивает содержимое всей страницы вокруг (включая панель заголовка регистрации), что не является ожидаемым поведением. [См. Приложение «Люди» на Windows Phone и попробуйте добавить новый контакт. Это содержит аналогичную структуру, но ScrollViewer правильно ведет себя лишь толкая содержание в ScrollViewer вверх]

Test Cases

  • Выберите TextBox, который виден в верхней части экрана, чтобы открыть клавиатура.
  • Попытка прокрутки в нижней части страницы с открытой клавиатурой.
  • Элементы в нижней части страницы недоступны.

или

  • Выберите TextBox, который виден в нижней части экрана.
  • Содержимое всей страницы подталкивается вверх.
  • Попытка прокрутки вверху страницы с открытой клавиатурой.
  • Элементы в верхней части страницы недоступны, и панель заголовка никогда не возвращается в поле зрения, пока клавиатура не будет закрыта.

Любая помощь по решению этой проблемы будет оценена по достоинству. Благодарю.

+0

Следующее сообщение в блоге может быть хорошей отправной точкой для решения этой проблемы: http://sorokoletov.com/2011/08/windows-phone-70-handling-text-entry-screens/ –

+0

@PaulDiston Спасибо. Я читал этот блог раньше. Я попробовал демонстрационное приложение, и это не то, что я ищу. Переход очень крут (т. Е. Панель заголовка снова появляется, когда заканчивается анимация SIP), не говоря уже о том, что реализация чрезмерна для чего-то такого простого. Моя предполагаемая реализация соответствует сопоставлению форм контактных данных, которые вы найдете в приложении «Люди», которое включено в Windows Phone 7 для управления контактами и адресами. Это не сложный пример, и можно было бы ожидать, что это будет работать из коробки, а не покрывать элементы в форме. –

+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

Звучит как правдоподобный хак. Однако это работает, только если вы выберете поле в верхней части экрана (когда содержимое в нижней части scrollviewer будет закрыто). Физическое положение текстовых полей на экране влияет на то, сколько страницы нажата вверх. Поэтому, если он находится наверху, контент лишь слегка подталкивается. Если он находится внизу, контент подталкивается очень далеко. Насколько я знаю, невозможно определить, насколько настроена страница, что означает, что это трудно компенсировать. Кроме того, панель заголовков будет продолжать вытесняться с экрана, что не является идеальным. –

+0

Благодарю за ваше предложение. :) –

0

Я думаю, вы можете решить эту проблему, придя на проблеме с другой стороны. Телефон будет прокручивать страницу таким образом, чтобы SIP (программная клавиатура) никогда не закрывала TextBox с фокусом.

Однако вы можете заставить SIP скрыть, обнаружив события касания на верхнем элементе, содержащемся в вашем ScrollViewer, например.:

<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 пикселей к основанию, чтобы сделать ее прокруткой красиво. Эффект довольно плавный и не заставит ваш пользовательский интерфейс выглядеть «хакерским» ИМХО.

В вашем случае вам придется выяснить, автоматическую высоту LayoutRootGrid, а затем на RowDefinition рядка 1 установить высоту вручную - запоминание, чтобы добавить дополнительный 400px (или что-то выглядит уместно в вашей ситуации).

Для облегчения ввода я затем обрабатывается каждый OnKeyDown событие каждого TextBox изменить фокус к следующему TextBox при ударе Enter. На последнем TextBox я установил фокус на this.focus(), который устанавливает фокус на страницу и скрывает SIP.

0

Посмотрите на мою маленькую библиотеку, пожалуйста, - https://siphelper.codeplex.com/

Она изменяет высоту ScrollViewer и содержание можно прокручивать в верхней/нижнего пункта.

Если у вас есть предложения - не стесняйтесь обращаться ко мне.