2013-07-10 3 views
8

У меня возникли две проблемы с кодом, когда я делаю простое приложение для чата. В коде показан текстовый блок в верхней части страницы и два стека текстовых полей внизу. Плюс список, который будет автоматически высотой, чтобы заполнить оставшийся пробел.Элементы телефона Windows Phone прокручиваются при появлении SIP-клавиатуры

<Grid x:Name="LayoutRoot" Background="Transparent"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="1*"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <Rectangle Height="1" Fill="White" VerticalAlignment="Top"/> 
     <TextBlock Text="Hello World!" Grid.Row="0" FontSize="36"/> 
     <Listbox Grid.Row="1"/> 
     <TextBox Grid.Row="2"/> 
     <TextBox Grid.Row="3"/> 
</Grid> 
  1. Когда я нажимаю на одном из верхних текстовых полей, то SIP клавиатура становится видимым и все содержимое страницы выталкивается вверх. Основная проблема здесь заключается в том, что верхний текстовый блок исчезает и скрывается сверху. Как я могу держать его сверху и не двигаться, пока просматривается SIP-клавиатура?

  2. Когда основное нижнее текстовое поле имеет фокус, появляется клавиатура SIP и подталкивает весь контент вверх. В этом случае клавиатура будет просто соответствовать и быть липкой для этого текстового поля. Однако, когда другое текстовое поле имеет фокус, клавиатура сделает промежуток между ними. Как я могу заставить клавиатуру вести себя так же, как и при фокусировке самой нижней?

+0

Возможный дубликат [Windows Phone 7 размер клавиатуры] (http://stackoverflow.com/questions/4399153/windows-phone-7-keyboard-size) – SandRock

ответ

1

Когда клавиатура выскакивает и unpops, а TranslateTransform работает на PhoneApplicationFrame, перевод на весь экран вверх и вниз.

Основанный на this article, вы сможете получить перевод. Как вы можете наблюдать, анимация перемещает свойство Y от нуля до определенного отрицательного значения (на основе элемента управления, на который вы сосредоточились).

Вариант 1: Я не смог написать способ спуска этого значения, но вы должны иметь возможность изменять размеры элементов управления, чтобы они соответствовали тому, что осталось от экрана.

Вариант 2.0 (плохо): вы можете отменить или удалить эту анимацию. Клавиатура будет сверху экрана без каких-либо движений. Теперь переходите к перемещению/изменению размеров элементов управления, чтобы они соответствовали оставшемуся пространству.

public MainPage() 
    { 
     this.InitializeComponent(); 

     PhoneApplicationFrame frame = (App.Current as App).RootFrame; 
     var group = (frame.RenderTransform as TransformGroup); 
     group.Children.RemoveAt(0); // remove translate transform 
    } 

Вариант 2.1: Проблема с 2.0: удаление преобразования предотвратит уведомление вас о клавиатуре. Настройка обратной анимации на дочернем элементе страницы, когда изменяется свойство Y, будет «отменять» исходный перевод.

<Grid x:Name="LayoutRoot" Background="Transparent" VerticalAlignment="Stretch"> 
    <Grid.RenderTransform> 
     <TransformGroup> 
      <TranslateTransform /> 
     </TransformGroup> 
    </Grid.RenderTransform> 

    static void OnRootFrameTransformChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     // ... edit from the blog article ... 
     MainPage page = source as MainPage; 
     page.lb.Items.Add(newvalue); 
     var oppositeTransform = (TranslateTransform)((TransformGroup)page.RenderTransform).Children[0]; 
     if (newvalue < 0.0) 
     { 
      page.IsSipVisibleGuess.IsChecked = true; 
      oppositeTransform.Y = -newvalue; 
     } 
     else if (newvalue == 0.0) 
     { 
      page.IsSipVisibleGuess.IsChecked = false; 
      oppositeTransform.Y = 0; 
     } 

Я сожалею, ни один из этих вариантов не будет волшебно решить эту проблему, но это может помочь вам закодировать, что лучше всего подходит для вашего приложения.

Если вы нашли лучшее решение, сообщите об этом в ответ.

Смежные вопросы