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

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

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

当编辑第二个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();

        }

    }

}

 

谢谢@阿布的分享

 

 

 

你可能感兴趣的:(frame)