如何在Windows Phone中获取表单的行为,例如联系人>>新联系人>>姓名。在这个页面中,它在scrollviewer中有很多文本框。当用户点击任何文本框并获得焦点时,页面向上滚动并且标题保持不变并显示SIP键盘。 这是我的榜样,但不是它的工作原理键盘处于活动状态时ScrollViewer无法向上滚动
https://app.box.com/s/lxxcmxp8ckuottrweg52
为什么? 谢谢
如何在Windows Phone中获取表单的行为,例如联系人>>新联系人>>姓名。在这个页面中,它在scrollviewer中有很多文本框。当用户点击任何文本框并获得焦点时,页面向上滚动并且标题保持不变并显示SIP键盘。 这是我的榜样,但不是它的工作原理键盘处于活动状态时ScrollViewer无法向上滚动
https://app.box.com/s/lxxcmxp8ckuottrweg52
为什么? 谢谢
我已经修改,对于如下工作正常上面的代码。
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);
}
感谢
似乎仍然没有工作。 –
检查上面修改过的代码对我很好 –
它会进入课堂吗?你可以在Pastebin上发布整个课程+ XAML吗?这将有很大的帮助。在互联网上几乎没有解决方案 –
首先,命名您的滚动浏览器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);
}
您需要以下依赖属性添加到页面:
#region TranslateY dependency property
public static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register(
"TranslateYProperty", typeof(double), typeof(OrderContactPage), new PropertyMetadata(default(double), PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
((OrderContactPage)o)._translateTransform.Y = 0;
}
public double TranslateY
{
get { return (double)GetValue(TranslateYProperty); }
set { SetValue(TranslateYProperty, value); }
}
#endregion
而且还帮助字段:
private double _oldHeight;
private TranslateTransform _translateTransform;
您还需要处理一些事件为您滚动浏览器,将其添加到页面的结构或者:
ScrollViewer.Loaded += ScrollViewerOnLoaded;
ScrollViewer.SizeChanged += ScrollViewer_OnSizeChanged;
执行这些事件处理程序: 私人无效ScrollViewerOnLoaded(对象发件人,RoutedEventArgs routedEventArgs) { ScrollViewer.Loaded - = ScrollViewerOnLoaded; _oldHeight = ScrollViewer.ActualHeight; }
private async void ScrollViewer_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
await ScrollToFocusedElement();
}
private async Task ScrollToFocusedElement()
{
await Task.Yield();
var focusedElement = FocusManager.GetFocusedElement() as PhoneTextBox;
if (focusedElement != null)
{
// http://stackoverflow.com/questions/1225318/how-can-i-make-the-silverlight-scrollviewer-scroll-to-show-a-child-control-with
var focusedVisualTransform = focusedElement.TransformToVisual(ScrollViewer);
var rectangle =
focusedVisualTransform.TransformBounds(
new Rect(new Point(focusedElement.Margin.Left, focusedElement.Margin.Top), focusedElement.RenderSize));
var offset = ScrollViewer.VerticalOffset + (rectangle.Bottom - ScrollViewer.ViewportHeight);
ScrollViewer.ScrollToVerticalOffset(offset);
}
}
哇,这里有很多代码。我正在创建可重用的东西,但我还没有。一旦我做到了,我会在NuGet上发布它。
请注意,这仅适用于Portrait
模式,如果你有自动建议栏中打开,将无法正常工作。我并不需要处理,在我的应用程序,所以我跳过它:)
享受。
你好,谢谢你的回复,但在我的网页不是它的作品正确。 ScrollViewer的高度和焦点都有问题。我已经用你的代码更新了我的项目,你可以给我们看看。谢谢 –
你可以试试这个样本sample project
<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;
}
私有静态双_newValue;
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);
}
我知道你的意思,我可以在稍后提供源代码。您需要检测到您正在编辑文本,然后您需要调整大小并移动滚动查看器。实际上很乏味。 –
你有没有例子? –
现在不行,当我回家。 –