2015-05-16 2 views
-1

У меня был этот вопрос вчера, и, похоже, у многих людей были подобные проблемы в прошлом, поэтому я решил, что поставил бы свой вопрос & решение, которое я в итоге придумал. Microsoft имеет более чистые решения для этого в SDK 8.1, но подавляющее большинство пользователей приложений WP находятся на 8,0 и ниже, поэтому я думаю, что это все равно будет полезно.Как определить смещение клавиатуры

Когда вы открываете виртуальную клавиатуру в приложении Silverlight для Windows Phone 7/8, а текстовое поле, из-за которого открывалась клавиатура, находится в нижней половине экрана (которое будет закрыто клавиатурой), оно прокручивает вся страница вверх. Как вы можете определить, сколько он прокрутил, в случае, если в верхней части страницы есть контент, который вам нужно отобразить?

+0

Какое решение в 8.1 sdk? –

ответ

0

Это немного неуклюжий, но вы можете получить сумму, прокручиваемую страницей, глядя на смещение корневого фрейма.

Поскольку это анимируется в положение, вопрос становится «когда». То, что я обнаружил, что работает, когда запущено событие GotFocused текстового поля, подписаться на событие LayoutUpdated, а когда LayoutUpdated уволен, возьмите смещение оттуда. Если вы еще не подписались на это событие, вы можете отказаться от подписки в событии LostFocus. Таким образом, когда вы будете двигаться, вы получите изменения.

double lastOffset = 0; 

private void TextBox_GotFocus(object sender, RoutedEventArgs e) 
{ 
    LayoutUpdated += MyControl_LayoutUpdated; 
} 

private void MyControl_LayoutUpdated(object sender, EventArgs e) 
{ 
    // Grab the offset out of the root frame's RenderTransform object 
    PhoneApplicationFrame root = App.Current.RootVisual as PhoneApplicationFrame; 
    TransformGroup transform = root.RenderTransform as TransformGroup; 
    double offset = transform.Value.OffsetY; 

    if (offset != lastOffset) 
    { 
     // Do your logic here if the offset has changed 
     lastOffset = offset; 
    } 
} 

private void TextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    // Unsubcribe to updates and reset the offset to 0 
    LayoutUpdated -= MyControl_LayoutUpdated; 
    lastOffset = 0; 
} 

После этого смещения вы можете изменить свои элементы управления по мере необходимости. Вы можете либо уменьшить высоту элемента управления на эту сумму, либо если у вас есть что-то маленькое наверху, например заголовок, вы можете применить TranslateTransform путем обратного смещения, чтобы просто сдвинуть его вниз.