2013-07-10 36 views
8

我正在制作简单的聊天应用程序时,遇到以下代码的两个问题。代码在页面顶部显示一个文本块,在底部显示两个文本框。另外还有一个列表框,它将自动填充剩余空隙。当SIP键盘出现时,Windows Phone项目滚动问题

<Grid x:Name="LayoutRoot" Background="Transparent"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="1*"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <Rectangle Height="1" Fill="White" VerticalAlignment="Top"/> 
     <TextBlock Text="Hello World!" Grid.Row="0" FontSize="36"/> 
     <Listbox Grid.Row="1"/> 
     <TextBox Grid.Row="2"/> 
     <TextBox Grid.Row="3"/> 
</Grid> 
  1. 当我点击顶部的文本框之一,SIP键盘变为可见,并在页面中的所有内容都推高。这里的主要问题是顶部文本块消失并隐藏在顶部。在查看SIP键盘时,如何将其保持在最高位置而不移动?

  2. 当最底部的文本框有焦点时,会出现SIP键盘并向上推送所有内容。在这种情况下,键盘将适合并粘贴到该文本框。但是,当其他文本框具有焦点时,键盘会在它们之间产生间隙。如何让键盘按照最底层的焦点一样进行操作?

+0

[Windows phone 7键盘大小]的可能重复(http://stackoverflow.com/questions/4399153/windows-phone-7-keyboard-size) – SandRock

回答

1

当键盘持久性有机污染物和unpops,在PhoneApplicationFrame一个TranslateTransform运行,翻译整个屏幕上下。

根据this article,您应该能够获得翻译的价值。正如您可以观察到动画将Y属性从零移动到特定负值(基于您关注的控件)。选项1:我无法编写处理此值的下降方式,但您应该可以调整控件大小以适应屏幕左侧的内容。

选项2.0(坏):您可以取消或删除此动画。键盘将在屏幕上方无任何移动。现在轮到您移动/调整控件大小以适应剩余空间。

public MainPage() 
    { 
     this.InitializeComponent(); 

     PhoneApplicationFrame frame = (App.Current as App).RootFrame; 
     var group = (frame.RenderTransform as TransformGroup); 
     group.Children.RemoveAt(0); // remove translate transform 
    } 

选项2.1:2.0版存在问题:删除转换会阻止您收到有关键盘的通知。当Y属性更改时,在页​​面的子项上设置反转动画将“取消”原始翻译。

<Grid x:Name="LayoutRoot" Background="Transparent" VerticalAlignment="Stretch"> 
    <Grid.RenderTransform> 
     <TransformGroup> 
      <TranslateTransform /> 
     </TransformGroup> 
    </Grid.RenderTransform> 

    static void OnRootFrameTransformChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     // ... edit from the blog article ... 
     MainPage page = source as MainPage; 
     page.lb.Items.Add(newvalue); 
     var oppositeTransform = (TranslateTransform)((TransformGroup)page.RenderTransform).Children[0]; 
     if (newvalue < 0.0) 
     { 
      page.IsSipVisibleGuess.IsChecked = true; 
      oppositeTransform.Y = -newvalue; 
     } 
     else if (newvalue == 0.0) 
     { 
      page.IsSipVisibleGuess.IsChecked = false; 
      oppositeTransform.Y = 0; 
     } 

对不起,这些选项都不会奇迹般地解决问题,但它可以帮助您编写最适合您的应用的代码。

如果您发现了更好的解决方案,请将其作为答案发布。