Browse Source

Merge pull request #4498 from AvaloniaUI/fixes/dont-loose-textselection-when-context-menu-opens

TextBox - dont lose textselection when context menu opens
pull/4506/head
danwalmsley 6 years ago
committed by GitHub
parent
commit
09cb90bf03
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/Avalonia.Controls/ContextMenu.cs
  2. 11
      src/Avalonia.Controls/TextBox.cs
  3. 48
      tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

3
src/Avalonia.Controls/ContextMenu.cs

@ -280,9 +280,8 @@ namespace Avalonia.Controls
} }
_popup.Child = this; _popup.Child = this;
_popup.IsOpen = true;
IsOpen = true; IsOpen = true;
_popup.IsOpen = true;
RaiseEvent(new RoutedEventArgs RaiseEvent(new RoutedEventArgs
{ {

11
src/Avalonia.Controls/TextBox.cs

@ -410,10 +410,15 @@ namespace Avalonia.Controls
protected override void OnLostFocus(RoutedEventArgs e) protected override void OnLostFocus(RoutedEventArgs e)
{ {
base.OnLostFocus(e); base.OnLostFocus(e);
SelectionStart = 0;
SelectionEnd = 0; if (ContextMenu == null || !ContextMenu.IsOpen)
{
SelectionStart = 0;
SelectionEnd = 0;
RevealPassword = false;
}
_presenter?.HideCaret(); _presenter?.HideCaret();
RevealPassword = false;
} }
protected override void OnTextInput(TextInputEventArgs e) protected override void OnTextInput(TextInputEventArgs e)

48
tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

@ -17,6 +17,46 @@ namespace Avalonia.Controls.UnitTests
{ {
public class TextBoxTests public class TextBoxTests
{ {
[Fact]
public void Opening_Context_Menu_Does_not_Lose_Selection()
{
using (UnitTestApplication.Start(FocusServices))
{
var target1 = new TextBox
{
Template = CreateTemplate(),
Text = "1234",
ContextMenu = new TestContextMenu()
};
var target2 = new TextBox
{
Template = CreateTemplate(),
Text = "5678"
};
var sp = new StackPanel();
sp.Children.Add(target1);
sp.Children.Add(target2);
target1.ApplyTemplate();
target2.ApplyTemplate();
var root = new TestRoot() { Child = sp };
target1.SelectionStart = 0;
target1.SelectionEnd = 3;
target1.Focus();
Assert.False(target2.IsFocused);
Assert.True(target1.IsFocused);
target2.Focus();
Assert.Equal("123", target1.SelectedText);
}
}
[Fact] [Fact]
public void DefaultBindingMode_Should_Be_TwoWay() public void DefaultBindingMode_Should_Be_TwoWay()
{ {
@ -694,5 +734,13 @@ namespace Avalonia.Controls.UnitTests
public Task<object> GetDataAsync(string format) => Task.FromResult((object)null); public Task<object> GetDataAsync(string format) => Task.FromResult((object)null);
} }
private class TestContextMenu : ContextMenu
{
public TestContextMenu()
{
IsOpen = true;
}
}
} }
} }

Loading…
Cancel
Save