InputPane无法正常工作

时间:2016-04-10 14:00:26

标签: windows-phone-8.1 windows-phone win-universal-app windows-10-universal windows-10-mobile

我目前正在开发通用应用程序,但这是一个问题。我有一个框架与用户电话号码的TextBox。 Initial Page

所以,我想更改LayoutRoot(GRID)的高度,以便它可以放在自由空间中。
我出于此目的使用InputPane.GetForCurrentView().ShowingInputPane.GetForCurrentView().Hiding。 这是我的代码。

public UserRegistrationAuthorization_PhoneNumber()
    {
        this.InitializeComponent();
        LayoutRootInitialHeight = LayoutRoot.ActualHeight;
        InputPane.GetForCurrentView().Showing += UserRegistrationAuthorization_PhoneNumber_Showing;
        InputPane.GetForCurrentView().Hiding += UserRegistrationAuthorization_PhoneNumber_Hiding;
    }

private void UserRegistrationAuthorization_PhoneNumber_Showing(InputPane sender, InputPaneVisibilityEventArgs args)
    {
        LayoutRoot.Height = LayoutRoot.ActualHeight - args.OccludedRect.Height;
        LayoutRoot.VerticalAlignment = VerticalAlignment.Top;
        args.EnsuredFocusedElementInView = true;
    }

private void UserRegistrationAuthorization_PhoneNumber_Hiding(InputPane sender, InputPaneVisibilityEventArgs args)
    {
        // TODO: Get rid of that shit
        LayoutRoot.Height = LayoutRootInitialHeight;
        args.EnsuredFocusedElementInView = false;
    }

当我在TextBox键盘外面点击时隐藏并在屏幕上留下黑洞。 2

enter image description here

但是,最有趣的是,当我按下Lumia上的物理后退按钮时,键盘会正常隐藏,而我的LayoutRoot会获得Frame的初始高度。

这是一个错误还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是因为在构造函数中保存LayoutRootInitialHeight时,LayoutRoot实际上并未加载,而且它的ActualHeight == 0.然后将LayoutRoot.Height设置为0,因此它变得不可见。所以你应该将LayoutRootInitialHeight保存在LayoutRoot的Loaded事件处理程序中。

我还建议你不要改变LayoutRoot的高度。它会使你的整个视觉树从头开始呈现,这一般是不好的做法。相反,修改所有必要元素的RenderTransform,以便将它们移动到适当的位置。 RenderTransform是处理屏幕上动作和动画的正确方法,你可以通过Next按钮向上移动同键盘来实现一些不错的视觉效果。

大致你的代码看起来像这样:

<Button Content="Next" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center">
    <Button.RenderTransform>
        <CompositeTransform x:Name="NextButtonTransform" TranslateY="0"/>
    </Button.RenderTransform>
</Button>

...

private void UserRegistrationAuthorization_PhoneNumber_Showing(InputPane sender, InputPaneVisibilityEventArgs args)
{
    NextButtonTransform.TranslateY = -300;
    EnsuredFocusedElementInView = true;
}

private void UserRegistrationAuthorization_PhoneNumber_Hiding(InputPane sender, InputPaneVisibilityEventArgs args)
{
    NextButtonTransform.TranslateY = 0;
    args.EnsuredFocusedElementInView = false;
}

更复杂的方法是运行一些故事板,使你的下一个按钮以相同的速度上下移动键盘,始终显示在它上面。虽然,因为InputPane.GetForCurrentView()。显示在键盘已经完全显示后被触发,所以你应该将所有动画连接到TextBox.GotFocus和TextBox.LostFocus事件。在移动设备上,当文本框具有焦点时,键盘始终显示,因此它可以很好地工作。