Xaml 出现SIP键盘时Windows Phone项目滚动问题

Xaml 出现SIP键盘时Windows Phone项目滚动问题,xaml,windows-phone,Xaml,Windows Phone,当我在制作一个简单的聊天应用程序时,下面的代码有两个问题。 代码在页面顶部显示一个文本块,在底部显示两个文本框堆栈。加上一个列表框,该列表框将自动调整高度以填充剩余的间隙 <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDe

当我在制作一个简单的聊天应用程序时,下面的代码有两个问题。 代码在页面顶部显示一个文本块,在底部显示两个文本框堆栈。加上一个列表框,该列表框将自动调整高度以填充剩余的间隙

<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>

  • 当我点击顶部的一个文本框时,SIP键盘就会显示出来,页面中的所有内容都会向上推。这里的主要问题是顶部文本块消失并隐藏在顶部。在查看SIP键盘时,如何使其保持在顶部而不移动

  • 当最底部的文本框有焦点时,SIP键盘出现并向上推送所有内容。在这种情况下,键盘将刚好适合并粘住文本框。但是,当另一个文本框具有焦点时,键盘将在它们之间留出一个间隙。当最底部的键盘被聚焦时,我如何使键盘像它那样工作


  • 当键盘弹出并取消弹出时,
    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;
            }
    
    
    RootFrameTransformChanged上的静态无效(DependencyObject源、DependencyPropertyChangedEventArgs e)
    {
    //…从博客文章中编辑。。。
    主页面=源作为主页面;
    第页lb.Items.Add(新值);
    var oppositeTransform=(TranslateTransform)((TransformGroup)page.RenderTransform).Children[0];
    如果(新值<0.0)
    {
    page.IsSipVisibleGuess.IsChecked=true;
    Y=-newvalue;
    }
    else if(newvalue==0.0)
    {
    page.IsSipVisibleGuess.IsChecked=false;
    相反变换,Y=0;
    }
    
    很抱歉,这些选项都不能神奇地解决问题,但它可以帮助您编写最适合您的应用程序的代码

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

    可能的副本