diff --git a/src/Avalonia.Controls/Presenters/TextPresenter.cs b/src/Avalonia.Controls/Presenters/TextPresenter.cs index c241466aea..bda660be51 100644 --- a/src/Avalonia.Controls/Presenters/TextPresenter.cs +++ b/src/Avalonia.Controls/Presenters/TextPresenter.cs @@ -223,11 +223,11 @@ namespace Avalonia.Controls.Presenters if (PasswordChar != default(char)) { - result = base.CreateFormattedText(constraint, new string(PasswordChar, Text.Length)); + result = base.CreateFormattedText(constraint, new string(PasswordChar, text?.Length ?? 0)); } else { - result = base.CreateFormattedText(constraint, Text); + result = base.CreateFormattedText(constraint, text); } var selectionStart = SelectionStart; diff --git a/src/Avalonia.Controls/TextBlock.cs b/src/Avalonia.Controls/TextBlock.cs index 1fee309360..e7cf666589 100644 --- a/src/Avalonia.Controls/TextBlock.cs +++ b/src/Avalonia.Controls/TextBlock.cs @@ -111,6 +111,8 @@ namespace Avalonia.Controls /// public TextBlock() { + _text = string.Empty; + Observable.Merge( this.GetObservable(TextProperty).Select(_ => Unit.Default), this.GetObservable(TextAlignmentProperty).Select(_ => Unit.Default), diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/TextPresenter_Tests.cs b/tests/Avalonia.Controls.UnitTests/Presenters/TextPresenter_Tests.cs new file mode 100644 index 0000000000..23dae8f341 --- /dev/null +++ b/tests/Avalonia.Controls.UnitTests/Presenters/TextPresenter_Tests.cs @@ -0,0 +1,40 @@ +using Avalonia.Controls.Presenters; +using Xunit; + +namespace Avalonia.Controls.UnitTests.Presenters +{ + public class TextPresenter_Tests + { + [Fact] + public void TextPresenter_Can_Contain_Null_With_Password_Char_Set() + { + var target = new TextPresenter + { + PasswordChar = '*' + }; + + Assert.NotNull(target.FormattedText); + } + + [Fact] + public void TextPresenter_Can_Contain_Null_WithOut_Password_Char_Set() + { + var target = new TextPresenter(); + + Assert.NotNull(target.FormattedText); + } + + [Fact] + public void Text_Presenter_Replaces_Formatted_Text_With_Password_Char() + { + var target = new TextPresenter + { + PasswordChar = '*', + Text = "Test" + }; + + Assert.NotNull(target.FormattedText); + Assert.Equal("****", target.FormattedText.Text); + } + } +} diff --git a/tests/Avalonia.Controls.UnitTests/TextBlockTests.cs b/tests/Avalonia.Controls.UnitTests/TextBlockTests.cs index b8886456dd..9a1140fc05 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBlockTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBlockTests.cs @@ -15,5 +15,15 @@ namespace Avalonia.Controls.UnitTests BindingMode.OneWay, TextBlock.TextProperty.GetMetadata(typeof(TextBlock)).DefaultBindingMode); } + + [Fact] + public void Default_Text_Value_Should_Be_EmptyString() + { + var textBlock = new TextBlock(); + + Assert.Equal( + "", + textBlock.Text); + } } }