Windows phone 8 当键盘处于活动状态时,ScrollViewer不会向上滚动
如何在windows Phone中获取窗体行为,如联系人>>新联系人>>姓名。在此页面中,scrollviewer中有许多文本框。当用户点击任何文本框并获得焦点时,页面向上滚动,标题保持不变,并显示SIP键盘。 这是一个我的例子,但它不起作用 为什么??Windows phone 8 当键盘处于活动状态时,ScrollViewer不会向上滚动,windows-phone-8,Windows Phone 8,如何在windows Phone中获取窗体行为,如联系人>>新联系人>>姓名。在此页面中,scrollviewer中有许多文本框。当用户点击任何文本框并获得焦点时,页面向上滚动,标题保持不变,并显示SIP键盘。 这是一个我的例子,但它不起作用 为什么?? 谢谢首先,请命名您的滚动查看器ScrollViewer。之后,为页面上的每个文本框控件添加GotFocus和LostFocus事件处理程序,并在其中写入以下代码: private void txt_LostFocus(object sende
谢谢首先,请命名您的滚动查看器
ScrollViewer
。之后,为页面上的每个文本框控件添加GotFocus
和LostFocus
事件处理程序,并在其中写入以下代码:
private void txt_LostFocus(object sender, RoutedEventArgs routedEventArgs)
{
ScrollViewer.Height = _oldHeight;
}
void txt_GotFocus(object sender, RoutedEventArgs e)
{
var transform = ((Application.Current).RootVisual).RenderTransform as TransformGroup;
if (transform != null)
{
_translateTransform = transform.Children.OfType<TranslateTransform>().FirstOrDefault();
if (_translateTransform != null)
{
var binding = new Binding("Y")
{
Source = _translateTransform
};
BindingOperations.SetBinding(this, TranslateYProperty, binding);
}
}
var clipboardVisible = false;
try
{
clipboardVisible = Clipboard.ContainsText();
}
// ReSharper disable once EmptyGeneralCatchClause
catch
{
}
ScrollViewer.Height = _oldHeight - (clipboardVisible ? 407 : 338);
}
以及帮助器字段:
private double _oldHeight;
private TranslateTransform _translateTransform;
您还需要为滚动查看器处理一些事件,请将其添加到页面的构造函数中:
ScrollViewer.Loaded += ScrollViewerOnLoaded;
ScrollViewer.SizeChanged += ScrollViewer_OnSizeChanged;
实现这些事件处理程序:
private void ScrollViewerOnLoaded(对象发送方,RoutedEventArgs RoutedEventArgs)
{
ScrollViewer.Loaded-=ScrollViewerOnLoaded;
_oldHeight=ScrollViewer.ActualHeight;
}
哇,那里有很多代码。我正在努力创造一些可重用的东西,但我还没有做到。一旦我做到了,我会在NuGet上发布它
请注意,这仅适用于纵向
模式,如果打开自动建议栏,则无法完美工作。我不需要在我的应用程序中处理这个问题,所以跳过了:)
享受。我已经修改了上面的代码,它可以很好地工作,如下所示
public double OldHeight;
private TranslateTransform _translateTransform;
#region TranslateY dependency property
public static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register(
"TranslateYProperty", typeof(double), typeof(Chat), new PropertyMetadata(default(double), PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var chat = o as Chat;
#if DEBUG
Debug.WriteLine("New value:" + e.NewValue);
Debug.WriteLine("Old value:" + e.OldValue);
#endif
if (chat != null)
{
chat.UpdateTopMargin((double)e.NewValue);
}
}
public double TranslateY
{
get { return (double)GetValue(TranslateYProperty); }
set { SetValue(TranslateYProperty, value); }
}
#endregion
private void ChatPage_OnLoaded(object sender, RoutedEventArgs e)
{
var transform = ((Application.Current).RootVisual).RenderTransform as TransformGroup;
if (transform != null)
{
_translateTransform = transform.Children.OfType<TranslateTransform>().FirstOrDefault();
if (_translateTransform != null)
{
var binding = new Binding("Y")
{
Source = _translateTransform
};
BindingOperations.SetBinding(this, TranslateYProperty, binding);
}
}
}
private void UpdateTopMargin(double translateY)
{
LayoutRoot.Margin = new Thickness(0, -translateY, 0, 0);
}
公共双高;
私有TranslateTransform _TranslateTransform;
#区域TranslateY依赖属性
公共静态只读DependencyProperty TranslateYProperty=DependencyProperty.Register(
“TranslateYProperty”、typeof(double)、typeof(Chat)、新PropertyMetadata(默认值(double)、PropertyChangedCallback);
私有静态无效属性ChangedCallback(DependencyObject o、DependencyPropertyChangedEventArgs e)
{
var chat=o as chat;
#如果调试
Debug.WriteLine(“新值:+e.NewValue”);
Debug.WriteLine(“旧值:+e.OldValue”);
#恩迪夫
如果(聊天!=null)
{
UpdateTopMargin((双精度)e.NewValue);
}
}
公共双重翻译
{
获取{return(double)GetValue(TranslateYProperty);}
set{SetValue(TranslateYProperty,value);}
}
#端区
私有无效聊天页\已加载(对象发送方,RoutedEventArgs e)
{
var transform=((Application.Current).RootVisual.RenderTransform作为TransformGroup;
如果(转换!=null)
{
_translateTransform=transform.Children.OfType().FirstOrDefault();
if(_translateTransform!=null)
{
var绑定=新绑定(“Y”)
{
Source=\u translateTransform
};
BindingOperations.SetBinding(this,TranslateYProperty,binding);
}
}
}
私有void UpdateTopMargin(双translateY)
{
LayoutRoot.Margin=新厚度(0,-translateY,0,0);
}
谢谢您可以试试这个样品
公共主页()
{
初始化组件();
this.Loaded+=主页面_Loaded;
}
私有静态双新值
private static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register("TranslateY", typeof(double), typeof(MainPage), new PropertyMetadata(0d, OnRenderXPropertyChanged));
private double TranslateY
{
get { return (double)GetValue(TranslateYProperty); }
}
private static void OnRenderXPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if ((double)e.NewValue <= _newValue)
((MainPage)d).UpdateTopMargin((double)e.NewValue);
_newValue = (double)e.NewValue;
}
private void BindToKeyboardFocus()
{
var frame = Application.Current.RootVisual as PhoneApplicationFrame;
if (frame == null) return;
var group = frame.RenderTransform as TransformGroup;
if (@group == null) return;
var translate = @group.Children[0] as TranslateTransform;
var translateYBinding = new Binding("Y") { Source = translate };
SetBinding(TranslateYProperty, translateYBinding);
}
private void UpdateTopMargin(double translateY)
{
double prevTopMargin = LayoutRoot.Margin.Top;
LayoutRoot.Margin = new Thickness(0, -translateY, 0, 0);
}
private static readonly dependencProperty TranslateYProperty=dependencProperty.Register(“TranslateY”、typeof(double)、typeof(MainPage)、newpropertyMetadata(0d、OnRenderXPropertyChanged));
私人双重翻译
{
获取{return(double)GetValue(TranslateYProperty);}
}
私有静态无效OnRenderXPropertyChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
如果((双倍)e、 NewValue我知道你的意思,我可以稍后提供源代码。你需要检测到你正在编辑文本,然后你需要调整滚动查看器的大小和移动。实际上这很乏味。你有例子吗?现在没有,当我到家的时候。很好,如果你发送给我谢谢Shello,谢谢你的回复,但在我的页面中它不起作用正确。我的ScrollViewer的高度和焦点有问题。我已经用你的代码更新了我的项目,你能给我们看一下吗。谢谢你检查了上面修改过的代码,它对我很有用。它能进入课堂吗?你能把整个类+XAML发布到pastebin或其他东西上吗?这会有很大的帮助。根本没有解决方案正在上网谢谢,或者我应该说நன்றி :) 我会检查它并将其标记为答案。如果你在我的原始帖子中将此作为答案,我会将其标记为答案,这将有助于你的stackoverflow配置文件。
public double OldHeight;
private TranslateTransform _translateTransform;
#region TranslateY dependency property
public static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register(
"TranslateYProperty", typeof(double), typeof(Chat), new PropertyMetadata(default(double), PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var chat = o as Chat;
#if DEBUG
Debug.WriteLine("New value:" + e.NewValue);
Debug.WriteLine("Old value:" + e.OldValue);
#endif
if (chat != null)
{
chat.UpdateTopMargin((double)e.NewValue);
}
}
public double TranslateY
{
get { return (double)GetValue(TranslateYProperty); }
set { SetValue(TranslateYProperty, value); }
}
#endregion
private void ChatPage_OnLoaded(object sender, RoutedEventArgs e)
{
var transform = ((Application.Current).RootVisual).RenderTransform as TransformGroup;
if (transform != null)
{
_translateTransform = transform.Children.OfType<TranslateTransform>().FirstOrDefault();
if (_translateTransform != null)
{
var binding = new Binding("Y")
{
Source = _translateTransform
};
BindingOperations.SetBinding(this, TranslateYProperty, binding);
}
}
}
private void UpdateTopMargin(double translateY)
{
LayoutRoot.Margin = new Thickness(0, -translateY, 0, 0);
}
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="60" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid Grid.Row="0"
Background="#002080">
<TextBlock Text="PAGE HEADER" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
<Grid Grid.Row="1" />
<TextBox Grid.Row="2"
Text=""
x:Name="messageBox"
Background="White" LostFocus="MessageBox_OnLostFocus" />
</Grid>
public MainPage()
{
InitializeComponent();
this.Loaded += MainPage_Loaded;
}
private static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register("TranslateY", typeof(double), typeof(MainPage), new PropertyMetadata(0d, OnRenderXPropertyChanged));
private double TranslateY
{
get { return (double)GetValue(TranslateYProperty); }
}
private static void OnRenderXPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if ((double)e.NewValue <= _newValue)
((MainPage)d).UpdateTopMargin((double)e.NewValue);
_newValue = (double)e.NewValue;
}
private void BindToKeyboardFocus()
{
var frame = Application.Current.RootVisual as PhoneApplicationFrame;
if (frame == null) return;
var group = frame.RenderTransform as TransformGroup;
if (@group == null) return;
var translate = @group.Children[0] as TranslateTransform;
var translateYBinding = new Binding("Y") { Source = translate };
SetBinding(TranslateYProperty, translateYBinding);
}
private void UpdateTopMargin(double translateY)
{
double prevTopMargin = LayoutRoot.Margin.Top;
LayoutRoot.Margin = new Thickness(0, -translateY, 0, 0);
}