From f07f2c8c5a1b2b7c63129e400aed8c500b6e8eac Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 15 Jul 2021 14:25:01 +0100 Subject: [PATCH] Merge pull request #6213 from AvaloniaUI/fixes/textbox-crash-when-focused-but-not-visible Fixes/textbox crash when focused but not visible --- src/Avalonia.Controls/TextBox.cs | 21 +++++++++++--- .../TextBoxTests.cs | 29 +++++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index c1516613b3..3aef2abac5 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -1098,6 +1098,11 @@ namespace Avalonia.Controls private bool MoveVertical(int count) { + if (_presenter is null) + { + return false; + } + var formattedText = _presenter.FormattedText; var lines = formattedText.GetLines().ToList(); var caretIndex = CaretIndex; @@ -1113,14 +1118,17 @@ namespace Avalonia.Controls CaretIndex = hit.TextPosition + (hit.IsTrailing ? 1 : 0); return true; } - else - { - return false; - } + + return false; } private void MoveHome(bool document) { + if (_presenter is null) + { + return; + } + var text = Text ?? string.Empty; var caretIndex = CaretIndex; @@ -1151,6 +1159,11 @@ namespace Avalonia.Controls private void MoveEnd(bool document) { + if (_presenter is null) + { + return; + } + var text = Text ?? string.Empty; var caretIndex = CaretIndex; diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 64c0020f92..cb20071860 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -8,6 +8,7 @@ using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Input; using Avalonia.Input.Platform; +using Avalonia.Layout; using Avalonia.Media; using Avalonia.Platform; using Avalonia.UnitTests; @@ -556,6 +557,31 @@ namespace Avalonia.Controls.UnitTests Assert.True(true); } } + + [Theory] + [InlineData(Key.Up)] + [InlineData(Key.Down)] + [InlineData(Key.Home)] + [InlineData(Key.End)] + public void Textbox_doesnt_crash_when_Receives_input_and_template_not_applied(Key key) + { + using (UnitTestApplication.Start(FocusServices)) + { + var target1 = new TextBox + { + Template = CreateTemplate(), + Text = "1234", + IsVisible = false + }; + + var root = new TestRoot { Child = target1 }; + + target1.Focus(); + Assert.True(target1.IsFocused); + + RaiseKeyEvent(target1, key, KeyModifiers.None); + } + } [Fact] public void TextBox_GotFocus_And_LostFocus_Work_Properly() @@ -763,6 +789,9 @@ namespace Avalonia.Controls.UnitTests keyboardDevice: () => new KeyboardDevice(), keyboardNavigation: new KeyboardNavigationHandler(), inputManager: new InputManager(), + renderInterface: new MockPlatformRenderInterface(), + fontManagerImpl: new MockFontManagerImpl(), + textShaperImpl: new MockTextShaperImpl(), standardCursorFactory: Mock.Of()); private static TestServices Services => TestServices.MockThreadingInterface.With(