Как запретить редактору идти за клавиатурой в Xamarin.Forms? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть приложение чата. В настоящее время есть элемент управления Entry для добавления текста чата. Теперь я хочу обеспечить многострочный ввод, так же, как WhatsApp.

  • Если пользователь вводит более одной строки, текст должен автоматически переноситься на следующую строку.
  • Если пользователь нажимает кнопку Nextline на мобильной клавиатуре, он должен перейти к следующей строке.
  • Высота ввода должна автоматически увеличиваться до 3 строк, а также уменьшаться, если пользователь удаляет текст.

Для этого я попытался заменить Entry на Editor и реализовать следующие функции.

1- Поместите Редактор вместо входа. 2- Реализовать функцию, которая держит клавиатуру открытой, пока пользователь не нажмет на экран списка сообщений или кнопку назад.

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

Текущий код:

XAML:

<Grid x:Name="MessageControls" RowSpacing="1" ColumnSpacing="2" Padding="5"
 Grid.Row="1" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="auto" />
    </Grid.ColumnDefinitions>
    <local:ChatEditorWithPlaceholder  x:Name="txtMessage" Grid.Column="0"  TextChanged="EnableSend" Text="{Binding OutGoingText}"/>
    <Frame x:Name="SendButton" Grid.Column="1" Margin= "0" Padding="0" HasShadow="false" HeightRequest="25"
BackgroundColor="Transparent" HorizontalOptions="FillAndExpand">
        <Frame.GestureRecognizers>
            <TapGestureRecognizer Tapped="SendMessage_Click" NumberOfTapsRequired="1" />
        </Frame.GestureRecognizers>
        <Label Text="Send" x:Name="sendButton" TextColor="#1f88b7" HeightRequest="20"
    HorizontalOptions="Center" VerticalOptions="Center"/>
    </Frame>
</Grid>

Редактор

public class ChatEditorWithPlaceholder : Editor
{
    public ChatEditorWithPlaceholder()
    {
        this.TextChanged += (sender, e) => { this.InvalidateMeasure(); };
    }
}

Редактор Renderer:

public class ChatEditorRenderer : EditorRenderer
{
    protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
    }
}

protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
    base.OnElementChanged(e);
    if(Control != null) {
        Control.ScrollEnabled = false;
    }
    var element = this.Element as ChatEditorWithPlaceholder;

    Control.InputAccessoryView = null;
    Control.ShouldEndEditing += DisableHidingKeyboard;

    MessagingCenter.Subscribe<ConversationPage>(this, "FocusKeyboardStatus", (sender) =>
    {

        if (Control != null)
        {
            Control.ShouldEndEditing += EnableHidingKeyboard;
        }

        MessagingCenter.Unsubscribe<ConversationPage>(this, "FocusKeyboardStatus");
    });
}
private bool DisableHidingKeyboard(UITextView textView)
{
    return false;
}

private bool EnableHidingKeyboard(UITextView textView)
{
    return true;
}

Скриншоты: enter image description here

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Для Ios есть один плагин. Вы можете использовать это. Ссылка Здесь .

Для Andorid вы должны просто установить приведенный ниже код в MainActivity после метода LoadApplication (new App ()).

App.Current.On<Xamarin.Forms.PlatformConfiguration.Android().
UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);

Обновленный ответ для iOS:

Для IOS вы можете использовать следующий пользовательский рендер для решения проблемы наложения клавиатуры. И, пожалуйста, удалите пакет с клавиатурой overlap nuget из проекта.

using System;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using HBIClientFacingApp;
using HBIClientFacingApp.iOS;

[assembly:ExportRenderer( typeof(CustomEditor), typeof(CustomEditorRenderer))]
namespace YourNameSpace.iOS
{
    public class CustomEditorRenderer: EditorRenderer
    {
        public ChatEntryRenderer()
        {   
            UIKeyboard.Notifications.ObserveWillShow ((sender, args) => {

                if (Element != null)
                {
                    Element.Margin = new Thickness(0,0,0, args.FrameEnd.Height); //push the entry up to keyboard height when keyboard is activated
                }
            });

            UIKeyboard.Notifications.ObserveWillHide ((sender, args) => {

                if (Element != null)
                {
                       Element.Margin = new Thickness(0); //set the margins to zero when keyboard is dismissed
                }

            }); 
        }
    }
}
0 голосов
/ 03 июня 2019

Попробуйте этот рендерер для ios.

using System;  
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;   

[assembly:ExportRenderer( typeof(CustomEditor), typeof(CustomEditorRenderer))]
namespace YourNameSpace.iOS
{
    public class CustomEditorRenderer: EditorRenderer
    {
        public ChatEntryRenderer()
        {   
            UIKeyboard.Notifications.ObserveWillShow ((sender, args) => {

                if (Element != null)
                {
                    Element.Margin = new Thickness(0,0,0, args.FrameEnd.Height); //push the entry up to keyboard height when keyboard is activated
                }
            });

            UIKeyboard.Notifications.ObserveWillHide ((sender, args) => {

                if (Element != null)
                {
                       Element.Margin = new Thickness(0); //set the margins to zero when keyboard is dismissed
                }

            }); 
        }
    }
}

для Android добавьте его в MainActivity

 App.Current.On<Xamarin.Forms.PlatformConfiguration.Android>().
    UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...