• 【WP8】键盘弹出时控制Frame位置


    WP上,当使用TextBox输入文字的时候,键盘会把TextBox向上推一段距离

    当编辑第二个TextBox的时候,页面被上推,键盘刚好和TextBox靠在一起

    当编辑第一个TextBox的时候,页面被上推,键盘与TextBox有一段很小的距离

    现在需要实现一个文本输入的窗口,当用户编辑文本的时候,TextBox可以紧靠在TextBox

    实现:通过绑定监听ApplicationFrame的RenderTransform中的TranslateTransform中的Y属性的变化,从而自行控制Frame的位置

      当TextBox获得焦点的时候,键盘弹出,Frame被向上推,这时候监听到相关属性的变化,通过赋值覆盖变化

    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Media;
    using System.Windows.Navigation;
    using Microsoft.Phone.Controls;
    
    namespace PushFrameDemo
    {
        public partial class MainPage
        {
            #region 控制弹出键盘时,Frame的位置
    
            public static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register("TranslateY",
                typeof(double), typeof(MainPage), new PropertyMetadata(0.0, OnRenderYPropertyChanged));
    
            private static void OnRenderYPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                ((MainPage)d).UpdateTranslateY();
            }
    
            public void UpdateTranslateY()
            {
                var frame = Application.Current.RootVisual as PhoneApplicationFrame;
                if (frame != null)
                {
                    var tranformGroup = frame.RenderTransform as TransformGroup;
                    if (tranformGroup != null)
                    {
                        var translateTransform = (TranslateTransform)tranformGroup.Children[0];
    
                        //TODO:当键盘隐藏时,把Frame恢复原处
                        translateTransform.Y = 0;
    
                        //TODO:当键盘弹出时,把Frame推到键盘的上面
                        //translateTransform.Y = 408;
                    }
                }
            }
    
            /// <summary>
            /// 绑定Frames的属性(在页面进入的时候绑定,在页面离开的时候取消绑定)
            /// </summary>
            private void BindToFramesTranslateY()
            {
                var phoneApplicationFrame = Application.Current.RootVisual as PhoneApplicationFrame;
                if (phoneApplicationFrame != null)
                {
                    var transformGroup = phoneApplicationFrame.RenderTransform as TransformGroup;
                    if (transformGroup != null)
                    {
                        var source = transformGroup.Children[0] as TranslateTransform;
                        SetBinding(TranslateYProperty, new Binding("Y") { Source = source });
                    }
                }
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                //绑定依赖属性,监听Frame相关属性的变化
                BindToFramesTranslateY();
            }
    
            protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
            {
                //取消绑定
                ClearValue(TranslateYProperty);
            }
    
            #endregion
          
            // 构造函数
            public MainPage()
            {
                InitializeComponent();
            }
        }
    }

    谢谢@阿布的分享

  • 相关阅读:
    PHP+MySQL存储数据出现中文乱码的问题
    IE和火狐的css兼容性问题
    JS调用Webservice
    NET-使用Js调用WebService
    ASP.NET 与 Ajax 的实现方式
    未能加载文件或程序集“System.Web.Extensions, Version=1.0.61025.0, Culture=neutral
    c#webservice的简单示例
    HttpRequest Get和Post调用其他页面的方法
    MYSQL 递归操作
    sql with as 用法
  • 原文地址:https://www.cnblogs.com/bomo/p/3821406.html
Copyright © 2020-2023  润新知