Can't scroll till the end of the results when

2019-02-27 16:56发布

I am developing Windows Phone app and I've got this issue: I have a list control which displays my search results, but when the keyboard is opened some of my results aren't visible because of my keyboard...

Is there a way to shrink the control till keyboard border? In order to see all the results.

I want to scroll till the end of the results even when the keyboard is opened.

1条回答
We Are One
2楼-- · 2019-02-27 17:42

There is my solution

public class ResizeContentOnKeyboardShowingBehavior : Behavior<Page>
    {
        private readonly double _screenHeight;

        public ResizeContentOnKeyboardShowingBehavior()
        {
            _screenHeight = Window.Current.Bounds.Height;
        }

        protected override void OnAttached()
        {
            InputPane.GetForCurrentView().Showing += OnKeyboardShowing;
            InputPane.GetForCurrentView().Hiding += OnKeyboardHiding;
        }

        protected override void OnDetaching()
        {
            InputPane.GetForCurrentView().Showing -= OnKeyboardShowing;
            InputPane.GetForCurrentView().Hiding -= OnKeyboardHiding;
        }

        private void OnKeyboardHiding(InputPane sender, InputPaneVisibilityEventArgs args)
        {
            var content = (FrameworkElement)AssociatedObject.Content;

            content.Height = _screenHeight;
        }

        private void OnKeyboardShowing(InputPane sender, InputPaneVisibilityEventArgs args)
        {
            var content = (FrameworkElement)AssociatedObject.Content;

            double keyboardHeight = sender.OccludedRect.Height;

            content.Height = _screenHeight - keyboardHeight;
        }
    }

Base Behavior implementation:

public abstract class Behavior : DependencyObject, IBehavior
{
    public DependencyObject AssociatedObject { get; set; }

    public virtual void Attach(DependencyObject associatedObject)
    {
        AssociatedObject = associatedObject;
    }

    public virtual void Detach()
    {
    }
}

public abstract class Behavior<T> : Behavior
    where T : DependencyObject
{
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public new T AssociatedObject { get; set; }

    public override void Attach(DependencyObject associatedObject)
    {
        base.Attach(associatedObject);
        this.AssociatedObject = (T)associatedObject;
        OnAttached();
    }

    public override void Detach()
    {
        base.Detach();
        OnDetaching();
    }

    protected virtual void OnAttached()
    {
    }

    protected virtual void OnDetaching()
    {
    }
}

IBehavior interface is from Microsoft.Xaml.Interactivity namespace from Behaviors SDK http://scr.hu/4m4q/pzl07

Usage:

<Page x:Class="MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
  xmlns:behaviors="using:Behaviors">

<interactivity:Interaction.Behaviors>
    <behaviors:ResizeContentOnKeyboardShowingBehavior />
</interactivity:Interaction.Behaviors>

<Grid>

</Grid>

Or the same functionality but without behavior. Just added to page code behind.

public sealed partial class MainPage : Page
{
    private readonly InputPane _inputPane;
    private readonly double _screenHeight;

    public MainPage()
    {
        this.InitializeComponent();

        _screenHeight = Window.Current.Bounds.Height;
        _inputPane = InputPane.GetForCurrentView();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        _inputPane.Hiding += OnKeyboardHiding;
        _inputPane.Showing += OnKeyboardShowing;
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);

        _inputPane.Hiding -= OnKeyboardHiding;
        _inputPane.Showing -= OnKeyboardShowing;
    }

    private void OnKeyboardShowing(InputPane sender, InputPaneVisibilityEventArgs args)
    {
        var content = (FrameworkElement)Window.Current.Content;
        double keyboardHeight = sender.OccludedRect.Height;
        content.Height = _screenHeight - keyboardHeight;
    }

    private void OnKeyboardHiding(InputPane sender, InputPaneVisibilityEventArgs args)
    {
        var content = (FrameworkElement)Window.Current.Content;
        content.Height = _screenHeight;
    }
}
查看更多
登录 后发表回答