diff --git a/src/Avalonia.Base/Input/TextInput/TextInputMethodClient.cs b/src/Avalonia.Base/Input/TextInput/TextInputMethodClient.cs index e5960faa02..ca91b861a8 100644 --- a/src/Avalonia.Base/Input/TextInput/TextInputMethodClient.cs +++ b/src/Avalonia.Base/Input/TextInput/TextInputMethodClient.cs @@ -77,6 +77,8 @@ namespace Avalonia.Input.TextInput { SetPreeditText(preeditText); } + + public virtual void ShowInputPanel() { } protected virtual void RaiseTextViewVisualChanged() { diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 93ac672b55..699a13aae8 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -1724,6 +1724,8 @@ namespace Avalonia.Controls if (e.Pointer.Type != PointerType.Mouse && !_isDoubleTapped) { + _imClient.ShowInputPanel(); + var text = Text; var clickInfo = e.GetCurrentPoint(this); if (text != null && !(clickInfo.Pointer?.Captured is Border)) diff --git a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs index 05d38e70d4..0ff857985a 100644 --- a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs +++ b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs @@ -13,6 +13,7 @@ namespace Avalonia.Controls private TextPresenter? _presenter; private bool _selectionChanged; private bool _isInChange; + private ITextInputMethodImpl? _im; public override Visual TextViewVisual => _presenter!; @@ -24,7 +25,7 @@ namespace Avalonia.Controls { return ""; } - + if (_parent.CaretIndex != _presenter.CaretIndex) { _presenter.SetCurrentValue(TextPresenter.CaretIndexProperty, _parent.CaretIndex); @@ -34,7 +35,7 @@ namespace Avalonia.Controls { _presenter.SetCurrentValue(TextPresenter.TextProperty, _parent.Text); } - + var lineIndex = _presenter.TextLayout.GetLineIndexFromCharacterIndex(_presenter.CaretIndex, false); var textLine = _presenter.TextLayout.TextLines[lineIndex]; @@ -125,6 +126,11 @@ namespace Avalonia.Controls if (_parent != null) { _parent.PropertyChanged += OnParentPropertyChanged; + _im = (_parent.VisualRoot as ITextInputMethodRoot)?.InputMethod; + } + else + { + _im = null; } var oldPresenter = _presenter; @@ -133,7 +139,7 @@ namespace Avalonia.Controls { oldPresenter.ClearValue(TextPresenter.PreeditTextProperty); - oldPresenter.CaretBoundsChanged -= (s,e) => RaiseCursorRectangleChanged(); + oldPresenter.CaretBoundsChanged -= (s, e) => RaiseCursorRectangleChanged(); } _presenter = presenter; @@ -161,6 +167,17 @@ namespace Avalonia.Controls _presenter.SetCurrentValue(TextPresenter.PreeditTextCursorPositionProperty, cursorPos); } + public override void ShowInputPanel() + { + base.ShowInputPanel(); + + if (_parent is { } && _im is { }) + { + _im.SetOptions(TextInputOptions.FromStyledElement(_parent)); + _im.SetClient(this); + } + } + private static string GetTextLineText(TextLine textLine) { var builder = StringBuilderCache.Acquire(textLine.Length);