Почему я не могу прокрутить страницу вниз, когда активна экранная клавиатура

У меня есть куча элементов управления в коллекции стековых панелей, содержащихся в сетке. Сетка довольно длинная и выходит за пределы страницы, поэтому я поместил ее в средство просмотра прокрутки. Все работает отлично, и я могу прокручивать страницу вверх и вниз, пока клавиатура не станет активной. Как только это произойдет, я не смогу прокрутить содержимое до конца, когда выделено текстовое поле. Я могу прокручивать до определенной степени, но не до конца. Я делаю что-то неправильно? Мой код выглядит следующим образом:

<ScrollViewer Margin="12,0,12,0" Grid.Row="1">
        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Height="837" Width="456">                
            <StackPanel HorizontalAlignment="Left" Width="450" Margin="0,63,0,405">
                <TextBlock Height="30" Name="tBlk_Username" Text="Display Name" />
                <TextBox Height="71" Name="tb_UserNameVal" Text="{Binding UserNameValue, Mode=TwoWay}" Width="452" />
                <TextBlock Height="30" Name="tBlk_Email" Text="Email" />
                <TextBox Height="71" Name="tb_EmailVal" Text="{Binding EmailValue, Mode=TwoWay}" Width="452" />
                <TextBlock Height="30" Name="tBlk_Message" Text="Message" />
                <TextBox Height="130" Name="tb_MessageVal" Text="{Binding MessageValue, Mode=TwoWay}" Width="452" />
            </StackPanel>
            <StackPanel Height="37" HorizontalAlignment="Left" Margin="0,519,0,0" Name="stackPanel2"
                        VerticalAlignment="Top" Width="450">
                <TextBlock Height="30" Name="tBlk_PicInfo" Text="Include a Photo" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" Height="90" HorizontalAlignment="Left" Margin="12,432,0,0"
                        Name="stackPanel1" VerticalAlignment="Top" Width="450" d:LayoutOverrides="GridBox">
                <TextBox Height="71" Name="tb_Location" Text="{Binding Location}" Width="367" IsReadOnly="True" />
                <Button Height="60" Name="btn_Clear" Width="60" BorderThickness="0" Background="{Binding LocationImage}" Style="{StaticResource LocationButtonStyle}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <GalaSoft_MvvmLight_Command:EventToCommand x:Name="ClearCommand" Command="{Binding ClearCommand}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Height="205" HorizontalAlignment="Left" Margin="12,556,0,0"
                        Name="stackPanel3" VerticalAlignment="Top" Width="452" d:LayoutOverrides="GridBox">
                <Image Name="img_FlickrPic" Stretch="Fill" Width="260" Source="{Binding Capture}" Margin="0,13,0,0" />
                <Button Name="btn_Capture" Width="90" Height="90" Margin="0,67,0,55" BorderThickness="0">
                    <Button.Background>
                        <ImageBrush ImageSource="/Images/camera.png" />
                    </Button.Background>
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <GalaSoft_MvvmLight_Command:EventToCommand x:Name="CaptureClick" Command="{Binding CaptureCommand}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>                        
                </Button>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Height="100" HorizontalAlignment="Left"
                        Margin="4,763,0,0" Name="stackPanel4" VerticalAlignment="Top" Width="450" d:LayoutOverrides="GridBox">
                <Button Content="Submit" Height="71" Name="btn_Submit" Width="130" IsEnabled="{Binding SubmitEnabled}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <GalaSoft_MvvmLight_Command:EventToCommand x:Name="SubmitCommand" Command="{Binding SubmitCommand}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
            </StackPanel>
            <StackPanel Height="59" HorizontalAlignment="Left" Name="stackPanel5" VerticalAlignment="Top" Width="456" Orientation="Horizontal">
                <TextBlock FontFamily="{StaticResource HelveticaNeue}" Name="tBlk_StepConf" Text="Please share my " Width="150" TextAlignment="Center" Height="33" />
                <TextBlock FontFamily="{StaticResource HelveticaNeue}" Foreground="#FF00BCE4" Name="tBlk_StepConfCount" Text="{Binding StepVal}" Width="56" FontSize="34" TextAlignment="Center" VerticalAlignment="Top" />
                <TextBlock FontFamily="{StaticResource HelveticaNeue}" Name="tBlk_StepConfTrail" Text=" steps for water" Width="134" TextAlignment="Center" Height="40" />
            </StackPanel>
        </Grid>
    </ScrollViewer>

person Cranialsurge    schedule 01.03.2012    source источник
comment
что такое RowDefinition для строки ScrollViewer? И у вас есть определенные значения Crazy Margin и Height.. вы, вероятно, могли бы сделать все это чище, используя RowDefinitions и ColumnDefinitions, и решить проблему.   -  person William Melani    schedule 02.03.2012
comment
RowDefinition является частью сетки layoutroot, внутри которой находится scrollviewer. ‹Grid.RowDefinitions› ‹RowDefinition Height=Auto /› ‹RowDefinition Height=* /› ‹/Grid.RowDefinitions› Вы имеете в виду поместить панели стека внутри сетки содержимого в фактические строки, которые я определяю для этой сетки? Хм... Это повлияет на вертикальный диапазон контента?   -  person Cranialsurge    schedule 02.03.2012
comment
Когда вы жестко задаете значения, ваше приложение работает не во всех ситуациях. Возьмем, к примеру, вы решили поддержать пейзаж. Что ж, теперь ваши поля не растягиваются полностью, как должны, потому что вы жестко запрограммировали их на 452 пикселя.   -  person William Melani    schedule 02.03.2012
comment
Попался, спасибо. Я еще немного поиграю с макетами, чтобы немного освоиться с пользовательским интерфейсом.   -  person Cranialsurge    schedule 02.03.2012


Ответы (1)


Проблема в том, что ScrollViewer не обращает внимания на программную панель ввода (или клавиатуру), поэтому он прокручивается только до тех пор, пока может, так сказать, за клавиатурой.

Простое решение — добавить поле внизу элемента управления содержимым ScrollViewer.

Более длинное и сложное решение — добавить маржу при отображении SIP. К сожалению, для него нет события, но я думаю, что можно было бы слушать, когда текстовое поле получает или теряет фокус, и установить поле или, возможно, показать элемент управления внизу страницы, когда текстовое поле имеет фокус (и, следовательно, отображается SIP), и скрыть его, когда это не так.

person Patrick    schedule 09.09.2012