diff --git a/src/Avalonia.Base/Input/TextInput/TextInputMethodClient.cs b/src/Avalonia.Base/Input/TextInput/TextInputMethodClient.cs
index b31b7df8ef..ca91b861a8 100644
--- a/src/Avalonia.Base/Input/TextInput/TextInputMethodClient.cs
+++ b/src/Avalonia.Base/Input/TextInput/TextInputMethodClient.cs
@@ -64,6 +64,12 @@ namespace Avalonia.Input.TextInput
///
public virtual void SetPreeditText(string? preeditText) { }
+ ///
+ /// Execute specific context menu actions
+ ///
+ /// The to perform
+ public virtual void ExecuteContextMenuAction(ContextMenuAction action) { }
+
///
/// Sets the non-committed input string and cursor offset in that string
///
@@ -101,4 +107,12 @@ namespace Avalonia.Input.TextInput
}
public record struct TextSelection(int Start, int End);
+
+ public enum ContextMenuAction
+ {
+ Copy,
+ Cut,
+ Paste,
+ SelectAll
+ }
}
diff --git a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs
index d482be8024..0ff857985a 100644
--- a/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs
+++ b/src/Avalonia.Controls/TextBoxTextInputMethodClient.cs
@@ -201,6 +201,27 @@ namespace Avalonia.Controls
return lineText;
}
+ public override void ExecuteContextMenuAction(ContextMenuAction action)
+ {
+ base.ExecuteContextMenuAction(action);
+
+ switch (action)
+ {
+ case ContextMenuAction.Copy:
+ _parent?.Copy();
+ break;
+ case ContextMenuAction.Cut:
+ _parent?.Cut();
+ break;
+ case ContextMenuAction.Paste:
+ _parent?.Paste();
+ break;
+ case ContextMenuAction.SelectAll:
+ _parent?.SelectAll();
+ break;
+ }
+ }
+
private void OnParentPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == TextBox.TextProperty)