diff --git a/samples/ControlCatalog/Pages/TextBoxPage.xaml b/samples/ControlCatalog/Pages/TextBoxPage.xaml
index 481a459159..88094c70f3 100644
--- a/samples/ControlCatalog/Pages/TextBoxPage.xaml
+++ b/samples/ControlCatalog/Pages/TextBoxPage.xaml
@@ -1,61 +1,57 @@
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="ControlCatalog.Pages.TextBoxPage">
+
+
+
+
+
+
+
+
+
+
TextBox
A control into which the user can input text
-
+
-
+
-
+
-
+
-
-
-
+
+
+
-
- resm fonts
-
-
-
-
-
-
-
- res fonts
-
-
-
-
-
+
+ resm fonts
+
+
+
+
+
+
+
+ res fonts
+
+
+
+
+
diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs
index 559932bf80..d803d03258 100644
--- a/src/Avalonia.Controls/TextBox.cs
+++ b/src/Avalonia.Controls/TextBox.cs
@@ -1,3 +1,4 @@
+using System.Windows.Input;
using Avalonia.Input.Platform;
using System;
using System.Collections.Generic;
@@ -103,6 +104,21 @@ namespace Avalonia.Controls
public static readonly StyledProperty RevealPasswordProperty =
AvaloniaProperty.Register(nameof(RevealPassword));
+
+ public static readonly DirectProperty CanCutProperty =
+ AvaloniaProperty.RegisterDirect(
+ nameof(CanCut),
+ o => o.CanCut);
+
+ public static readonly DirectProperty CanCopyProperty =
+ AvaloniaProperty.RegisterDirect(
+ nameof(CanCopy),
+ o => o.CanCopy);
+
+ public static readonly DirectProperty CanPasteProperty =
+ AvaloniaProperty.RegisterDirect(
+ nameof(CanPaste),
+ o => o.CanPaste);
struct UndoRedoState : IEquatable
{
@@ -126,6 +142,9 @@ namespace Avalonia.Controls
private UndoRedoHelper _undoRedoHelper;
private bool _isUndoingRedoing;
private bool _ignoreTextChanges;
+ private bool _canCut;
+ private bool _canCopy;
+ private bool _canPaste;
private string _newLine = Environment.NewLine;
private static readonly string[] invalidCharacters = new String[1] { "\u007f" };
@@ -378,6 +397,33 @@ namespace Avalonia.Controls
SelectionStart = SelectionEnd = CaretIndex;
}
+ ///
+ /// Property for determining if the Cut command can be executed.
+ ///
+ public bool CanCut
+ {
+ get { return _canCut; }
+ private set { SetAndRaise(CanCutProperty, ref _canCut, value); }
+ }
+
+ ///
+ /// Property for determining if the Copy command can be executed.
+ ///
+ public bool CanCopy
+ {
+ get { return _canCopy; }
+ private set { SetAndRaise(CanCopyProperty, ref _canCopy, value); }
+ }
+
+ ///
+ /// Property for determining if the Paste command can be executed.
+ ///
+ public bool CanPaste
+ {
+ get { return _canPaste; }
+ private set { SetAndRaise(CanPasteProperty, ref _canPaste, value); }
+ }
+
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
_presenter = e.NameScope.Get("PART_TextPresenter");
@@ -395,9 +441,19 @@ namespace Avalonia.Controls
if (change.Property == TextProperty)
{
UpdatePseudoclasses();
+ UpdateCommandStates();
}
}
+ private void UpdateCommandStates()
+ {
+ var text = GetSelection();
+ var b1 = string.IsNullOrEmpty(text);
+ CanCopy = !b1;
+ CanCut = !b1;
+ CanPaste = !IsReadOnly;
+ }
+
protected override void OnGotFocus(GotFocusEventArgs e)
{
base.OnGotFocus(e);
@@ -412,6 +468,8 @@ namespace Avalonia.Controls
SelectAll();
}
+ UpdateCommandStates();
+
_presenter?.ShowCaret();
}
@@ -425,6 +483,8 @@ namespace Avalonia.Controls
RevealPassword = false;
}
+ UpdateCommandStates();
+
_presenter?.HideCaret();
}
@@ -469,6 +529,9 @@ namespace Avalonia.Controls
public async void Cut()
{
+ var text = GetSelection();
+ if (text is null) return;
+
_undoRedoHelper.Snapshot();
Copy();
DeleteSelection();
@@ -477,17 +540,18 @@ namespace Avalonia.Controls
public async void Copy()
{
+ var text = GetSelection();
+ if (text is null) return;
+
await ((IClipboard)AvaloniaLocator.Current.GetService(typeof(IClipboard)))
- .SetTextAsync(GetSelection());
+ .SetTextAsync(text);
}
public async void Paste()
{
var text = await ((IClipboard)AvaloniaLocator.Current.GetService(typeof(IClipboard))).GetTextAsync();
- if (text == null)
- {
- return;
- }
+
+ if (text is null) return;
_undoRedoHelper.Snapshot();
HandleTextInput(text);