8

在制作一个简单的聊天应用程序时,我面临以下代码的两个问题。该代码在页面顶部显示一个文本块,在底部显示两个文本框堆栈。加上一个自动高度的列表框来填补剩余的空白。

<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 键盘并将所有内容向上推送。在这种情况下,键盘将恰好适合并粘在该文本框上。但是,当另一个文本框具有焦点时,键盘会在它们之间产生间隙。当最底部的键盘聚焦时,如何使键盘表现得像它一样?

4

1 回答 1

1

当键盘弹出和取消弹出时,a 会TranslateTransform在 上运行PhoneApplicationFrame,上下平移整个屏幕。

根据这篇文章,你应该可以得到翻译的价值。如您所见,动画将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;
        }

很抱歉,这些选项都不能神奇地解决问题,但它可以帮助您编写最适合您的应用程序的代码。

如果您从中找到更好的解决方案,请将其发布为答案。

于 2013-12-21T01:19:49.840 回答