У меня есть приложение чата. В настоящее время есть элемент управления 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;
}
Скриншоты: