我目前正在开发通用应用程序,但这是一个问题。我有一个框架与用户电话号码的TextBox。
所以,我想更改LayoutRoot(GRID)的高度,以便它可以放在自由空间中。
我出于此目的使用InputPane.GetForCurrentView().Showing
和InputPane.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
但是,最有趣的是,当我按下Lumia上的物理后退按钮时,键盘会正常隐藏,而我的LayoutRoot会获得Frame的初始高度。
这是一个错误还是我做错了什么?
答案 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事件。在移动设备上,当文本框具有焦点时,键盘始终显示,因此它可以很好地工作。