2014-02-26 64 views
2

如何在Windows Phone中获取表单的行为,例如联系人>>新联系人>>姓名。在这个页面中,它在scrollviewer中有很多文本框。当用户点击任何文本框并获得焦点时,页面向上滚动并且标题保持不变并显示SIP键盘。 这是我的榜样,但不是它的工作原理键盘处于活动状态时ScrollViewer无法向上滚动

https://app.box.com/s/lxxcmxp8ckuottrweg52

为什么? 谢谢

+0

我知道你的意思,我可以在稍后提供源代码。您需要检测到您正在编辑文本,然后您需要调整大小并移动滚动查看器。实际上很乏味。 –

+0

你有没有例子? –

+0

现在不行,当我回家。 –

回答

1

我已经修改,对于如下工作正常上面的代码。

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); 
    } 

感谢

+0

似乎仍然没有工作。 –

+0

检查上面修改过的代码对我很好 –

+0

它会进入课堂吗?你可以在Pastebin上发布整个课程+ XAML吗?这将有很大的帮助。在互联网上几乎没有解决方案 –

0

首先,命名您的滚动浏览器ScrollViewer。之后添加GotFocusLostFocus的事件处理程序页面上的每个文本框控件,并写下面的代码里面:

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模式,如果你有自动建议栏中打开,将无法正常工作。我并不需要处理,在我的应用程序,所以我跳过它:)

享受。

+0

你好,谢谢你的回复,但在我的网页不是它的作品正确。 ScrollViewer的高度和焦点都有问题。我已经用你的代码更新了我的项目,你可以给我们看看。谢谢 –

0

你可以试试这个样本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); 
    } 
相关问题