键盘存在时Windows Phone应用程序滚动问题

键盘存在时Windows Phone应用程序滚动问题,windows,xaml,windows-phone-8,scroll,scrollviewer,Windows,Xaml,Windows Phone 8,Scroll,Scrollviewer,我有一个由几个UI元素组成的屏幕,主要是文本框。当文本框聚焦时,整个页面向上推,将标题移出屏幕。我希望标题位于固定位置,其余内容在ScrollViewer中向上推。理想情况下,我希望偏移量按预期放置,并以正确的焦点显示/隐藏键盘到UI元素。本机报警应用程序是正确滚动行为的一个很好的例子。 感谢您的帮助。干杯 我也有同样的问题。但最后我解决了它,我只是用Height属性来做这个。请执行以下步骤 首先创建一个ScrollViewer 指示ScrollViewer创建一个容器(例如:网格/堆栈面板/

我有一个由几个UI元素组成的屏幕,主要是文本框。当文本框聚焦时,整个页面向上推,将标题移出屏幕。我希望标题位于固定位置,其余内容在ScrollViewer中向上推。理想情况下,我希望偏移量按预期放置,并以正确的焦点显示/隐藏键盘到UI元素。本机报警应用程序是正确滚动行为的一个很好的例子。 感谢您的帮助。干杯


我也有同样的问题。但最后我解决了它,我只是用Height属性来做这个。请执行以下步骤

  • 首先创建一个ScrollViewer
  • 指示ScrollViewer创建一个容器(例如:网格/堆栈面板/边框等),并将每个控件放入其中
  • 为ScrollViewer和容器设置固定高度(注意:容器的高度应大于ScrollViewer的高度)
请参阅下面的代码

<ScrollViewer Height="500">
        <Grid Name="Container" Height="700">
            <TextBox/>
            <TextBox/>
            <TextBox/>
        </Grid>
</ScrollViewer>


现在,您可以滚动容器网格,甚至可以滚动显示的键盘,甚至可以将焦点放在文本框上。您可以聚焦任何文本框,ScrollViewer将不会向后滚动。

呈现SIP键盘时,PhoneApplicationFrame.TranslateTransform.Y设置为特定值。要更新布局,我们只需将顶部边距设置为指定的值(-s),然后Silverlight布局系统将修复该问题

这里是XAML部分:

<Grid x:Name="LayoutRoot" >
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <StackPanel Grid.Row="0" Margin="12,17,0,28">
        <TextBlock Text="WINDOWS PHONE" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock Text="developer's ?" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>
    <Grid Grid.Row="1" Margin="12,0,12,0"></Grid>
    <TextBox Grid.Row="2" LostFocus="TextBox_OnLostFocus" />
</Grid>

C#份数

public部分类主页:PhoneApplicationPage
{
私有静态双newValue=0.0;
public static readonly dependencProperty TranslateYProperty=dependencProperty.Register(“TranslateY”、typeof(double)、typeof(MainPage)、newpropertyMetadata(0d、OnRenderXPropertyChanged));
公共主页()
{
初始化组件();
this.Loaded+=BindToKeyboardFocus;
}
私有void bindtokeBoardFocus(对象发送方,路由目标)
{
PhoneApplicationFrame=Application.Current.RootVisual作为PhoneApplicationFrame;
如果(帧!=null)
{
var group=frame.RenderTransform作为TransformGroup;
如果(组!=null)
{
var translate=group.Children[0]作为TranslateTransform;
var translateYBinding=新绑定(“Y”);
translateYBinding.Source=translate;
设置绑定(TranslateYProperty,translateYBinding);
}
}
}
公共双重翻译
{
获取{return(double)GetValue(TranslateYProperty);}
set{SetValue(TranslateYProperty,value);}
}
私有静态无效OnRenderXPropertyChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{

如果((双倍)e、 NewValue我看不出报警应用程序的运行方式有什么不同。它完全按照你说的做你不希望它做的事情,并推动一切。你能尝试清楚地解释一下标准行为在你的情况下是如何不起作用的,可能用一些代码来演示你想要改变的行为吗?它不会推动halarm app中的Reader,但只有scrollviewer中标题下的所有内容。我希望在键盘打开时保留标题,并像上面那样移动其余内容。通常我看到许多应用程序将所有布局内容包装在scrollviewer周围,以便最上面的控件在屏幕外移动。我们如何做到这一点?(由于法律问题,我无法共享屏幕抱歉,但请检查任何应用程序,当键盘处于活动状态时,大多数应用程序都会导致相同的屏幕外推)您好,谢谢您的回复。我试过了,但键盘仍在向上推标题面板,使其脱离屏幕。您能为整个屏幕发布一些xaml代码吗?我为我的gitHub帐户添加了一个项目url。现在可能已经修复了。
public partial class MainPage : PhoneApplicationPage
{
    private static double newValue = 0.0;
    public static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register("TranslateY", typeof(double), typeof(MainPage), new PropertyMetadata(0d, OnRenderXPropertyChanged));

    public MainPage()
    {
        InitializeComponent();
        this.Loaded += BindToKeyboardFocus;
    }

    private void BindToKeyboardFocus(object sender, RoutedEventArgs e)
    {
        PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
        if (frame != null)
        {
            var group = frame.RenderTransform as TransformGroup;
            if (group != null)
            {
                var translate = group.Children[0] as TranslateTransform;
                var translateYBinding = new Binding("Y");
                translateYBinding.Source = translate;
                SetBinding(TranslateYProperty, translateYBinding);
            }
        }
    }

    public double TranslateY
    {
        get { return (double)GetValue(TranslateYProperty); }
        set { SetValue(TranslateYProperty, value); }
    }

    private static void OnRenderXPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if ((double)e.NewValue <= newValue)
            ((MainPage)d).UpdateTopMargin((double)e.NewValue);
        newValue = (double)e.NewValue;
    }

    private void UpdateTopMargin(double translateY)
    {
        LayoutRoot.Margin = new Thickness(0, -translateY, 0, 0);
    }

    private void TextBox_OnLostFocus(object sender, RoutedEventArgs e)
    { 
        LayoutRoot.Margin = new Thickness();
    }
}