Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows phone 8 当键盘处于活动状态时,ScrollViewer不会向上滚动_Windows Phone 8 - Fatal编程技术网

Windows phone 8 当键盘处于活动状态时,ScrollViewer不会向上滚动

Windows phone 8 当键盘处于活动状态时,ScrollViewer不会向上滚动,windows-phone-8,Windows Phone 8,如何在windows Phone中获取窗体行为,如联系人>>新联系人>>姓名。在此页面中,scrollviewer中有许多文本框。当用户点击任何文本框并获得焦点时,页面向上滚动,标题保持不变,并显示SIP键盘。 这是一个我的例子,但它不起作用 为什么?? 谢谢首先,请命名您的滚动查看器ScrollViewer。之后,为页面上的每个文本框控件添加GotFocus和LostFocus事件处理程序,并在其中写入以下代码: private void txt_LostFocus(object sende

如何在windows Phone中获取窗体行为,如联系人>>新联系人>>姓名。在此页面中,scrollviewer中有许多文本框。当用户点击任何文本框并获得焦点时,页面向上滚动,标题保持不变,并显示SIP键盘。 这是一个我的例子,但它不起作用

为什么??
谢谢

首先,请命名您的滚动查看器
ScrollViewer
。之后,为页面上的每个文本框控件添加
GotFocus
LostFocus
事件处理程序,并在其中写入以下代码:

private void txt_LostFocus(object sender, RoutedEventArgs routedEventArgs)
{
    ScrollViewer.Height = _oldHeight;
}

void txt_GotFocus(object sender, RoutedEventArgs e)
{
    var transform = ((Application.Current).RootVisual).RenderTransform as TransformGroup;
    if (transform != null)
    {
        _translateTransform = transform.Children.OfType<TranslateTransform>().FirstOrDefault();
        if (_translateTransform != null)
        {
            var binding = new Binding("Y")
            {
                Source = _translateTransform
            };
            BindingOperations.SetBinding(this, TranslateYProperty, binding);
        }
    }
    var clipboardVisible = false;
    try
    {
        clipboardVisible = Clipboard.ContainsText();
    }
    // ReSharper disable once EmptyGeneralCatchClause
    catch
    {
    }
    ScrollViewer.Height = _oldHeight - (clipboardVisible ? 407 : 338);
}
以及帮助器字段:

private double _oldHeight;
private TranslateTransform _translateTransform;
您还需要为滚动查看器处理一些事件,请将其添加到页面的构造函数中:

ScrollViewer.Loaded += ScrollViewerOnLoaded;
ScrollViewer.SizeChanged += ScrollViewer_OnSizeChanged;
实现这些事件处理程序: private void ScrollViewerOnLoaded(对象发送方,RoutedEventArgs RoutedEventArgs) { ScrollViewer.Loaded-=ScrollViewerOnLoaded; _oldHeight=ScrollViewer.ActualHeight; }

哇,那里有很多代码。我正在努力创造一些可重用的东西,但我还没有做到。一旦我做到了,我会在NuGet上发布它

请注意,这仅适用于
纵向
模式,如果打开自动建议栏,则无法完美工作。我不需要在我的应用程序中处理这个问题,所以跳过了:)


享受。

我已经修改了上面的代码,它可以很好地工作,如下所示

    public double OldHeight;
    private TranslateTransform _translateTransform;

    #region TranslateY dependency property
    public static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register(
        "TranslateYProperty", typeof(double), typeof(Chat), new PropertyMetadata(default(double), PropertyChangedCallback));

    private static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        var chat = o as Chat;
   #if DEBUG
        Debug.WriteLine("New value:" + e.NewValue);
        Debug.WriteLine("Old value:" + e.OldValue);
   #endif
        if (chat != null)
        {
            chat.UpdateTopMargin((double)e.NewValue);
        }
    }

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

    private void ChatPage_OnLoaded(object sender, RoutedEventArgs e)
    {
        var transform = ((Application.Current).RootVisual).RenderTransform as TransformGroup;
        if (transform != null)
        {
            _translateTransform = transform.Children.OfType<TranslateTransform>().FirstOrDefault();
            if (_translateTransform != null)
            {
                var binding = new Binding("Y")
                {
                    Source = _translateTransform
                };
                BindingOperations.SetBinding(this, TranslateYProperty, binding);
            }
        }
    }

    private void UpdateTopMargin(double translateY)
    {
        LayoutRoot.Margin = new Thickness(0, -translateY, 0, 0);
    }
公共双高;
私有TranslateTransform _TranslateTransform;
#区域TranslateY依赖属性
公共静态只读DependencyProperty TranslateYProperty=DependencyProperty.Register(
“TranslateYProperty”、typeof(double)、typeof(Chat)、新PropertyMetadata(默认值(double)、PropertyChangedCallback);
私有静态无效属性ChangedCallback(DependencyObject o、DependencyPropertyChangedEventArgs e)
{
var chat=o as chat;
#如果调试
Debug.WriteLine(“新值:+e.NewValue”);
Debug.WriteLine(“旧值:+e.OldValue”);
#恩迪夫
如果(聊天!=null)
{
UpdateTopMargin((双精度)e.NewValue);
}
}
公共双重翻译
{
获取{return(double)GetValue(TranslateYProperty);}
set{SetValue(TranslateYProperty,value);}
}
#端区
私有无效聊天页\已加载(对象发送方,RoutedEventArgs e)
{
var transform=((Application.Current).RootVisual.RenderTransform作为TransformGroup;
如果(转换!=null)
{
_translateTransform=transform.Children.OfType().FirstOrDefault();
if(_translateTransform!=null)
{
var绑定=新绑定(“Y”)
{
Source=\u translateTransform
};
BindingOperations.SetBinding(this,TranslateYProperty,binding);
}
}
}
私有void UpdateTopMargin(双translateY)
{
LayoutRoot.Margin=新厚度(0,-translateY,0,0);
}
谢谢

您可以试试这个样品


公共主页()
{
初始化组件();
this.Loaded+=主页面_Loaded;
}
私有静态双新值

    private static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register("TranslateY", typeof(double), typeof(MainPage), new PropertyMetadata(0d, OnRenderXPropertyChanged));

    private double TranslateY
    {
        get { return (double)GetValue(TranslateYProperty); }
    }

    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 BindToKeyboardFocus()
    {
        var frame = Application.Current.RootVisual as PhoneApplicationFrame;
        if (frame == null) return;
        var group = frame.RenderTransform as TransformGroup;
        if (@group == null) return;
        var translate = @group.Children[0] as TranslateTransform;
        var translateYBinding = new Binding("Y") { Source = translate };
        SetBinding(TranslateYProperty, translateYBinding);
    }

    private void UpdateTopMargin(double translateY)
    {
        double prevTopMargin = LayoutRoot.Margin.Top;
        LayoutRoot.Margin = new Thickness(0, -translateY, 0, 0);
    }
private static readonly dependencProperty TranslateYProperty=dependencProperty.Register(“TranslateY”、typeof(double)、typeof(MainPage)、newpropertyMetadata(0d、OnRenderXPropertyChanged));
私人双重翻译
{
获取{return(double)GetValue(TranslateYProperty);}
}
私有静态无效OnRenderXPropertyChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{

如果((双倍)e、 NewValue我知道你的意思,我可以稍后提供源代码。你需要检测到你正在编辑文本,然后你需要调整滚动查看器的大小和移动。实际上这很乏味。你有例子吗?现在没有,当我到家的时候。很好,如果你发送给我谢谢Shello,谢谢你的回复,但在我的页面中它不起作用正确。我的ScrollViewer的高度和焦点有问题。我已经用你的代码更新了我的项目,你能给我们看一下吗。谢谢你检查了上面修改过的代码,它对我很有用。它能进入课堂吗?你能把整个类+XAML发布到pastebin或其他东西上吗?这会有很大的帮助。根本没有解决方案正在上网谢谢,或者我应该说நன்றி :) 我会检查它并将其标记为答案。如果你在我的原始帖子中将此作为答案,我会将其标记为答案,这将有助于你的stackoverflow配置文件。
    public double OldHeight;
    private TranslateTransform _translateTransform;

    #region TranslateY dependency property
    public static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register(
        "TranslateYProperty", typeof(double), typeof(Chat), new PropertyMetadata(default(double), PropertyChangedCallback));

    private static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        var chat = o as Chat;
   #if DEBUG
        Debug.WriteLine("New value:" + e.NewValue);
        Debug.WriteLine("Old value:" + e.OldValue);
   #endif
        if (chat != null)
        {
            chat.UpdateTopMargin((double)e.NewValue);
        }
    }

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

    private void ChatPage_OnLoaded(object sender, RoutedEventArgs e)
    {
        var transform = ((Application.Current).RootVisual).RenderTransform as TransformGroup;
        if (transform != null)
        {
            _translateTransform = transform.Children.OfType<TranslateTransform>().FirstOrDefault();
            if (_translateTransform != null)
            {
                var binding = new Binding("Y")
                {
                    Source = _translateTransform
                };
                BindingOperations.SetBinding(this, TranslateYProperty, binding);
            }
        }
    }

    private void UpdateTopMargin(double translateY)
    {
        LayoutRoot.Margin = new Thickness(0, -translateY, 0, 0);
    }
<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="60" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid Grid.Row="0"
          Background="#002080">
        <TextBlock  Text="PAGE HEADER" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>

    <Grid Grid.Row="1" />


    <TextBox Grid.Row="2"
             Text=""
             x:Name="messageBox"
             Background="White" LostFocus="MessageBox_OnLostFocus" />
  </Grid>


    public MainPage()
    {
        InitializeComponent();
        this.Loaded += MainPage_Loaded;
    }
    private static readonly DependencyProperty TranslateYProperty = DependencyProperty.Register("TranslateY", typeof(double), typeof(MainPage), new PropertyMetadata(0d, OnRenderXPropertyChanged));

    private double TranslateY
    {
        get { return (double)GetValue(TranslateYProperty); }
    }

    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 BindToKeyboardFocus()
    {
        var frame = Application.Current.RootVisual as PhoneApplicationFrame;
        if (frame == null) return;
        var group = frame.RenderTransform as TransformGroup;
        if (@group == null) return;
        var translate = @group.Children[0] as TranslateTransform;
        var translateYBinding = new Binding("Y") { Source = translate };
        SetBinding(TranslateYProperty, translateYBinding);
    }

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