Browse Source

Fix TextBlock TextProperty update handling for non complex content

pull/9349/head
Benedikt Stebner 4 years ago
parent
commit
b370a0b649
  1. 52
      src/Avalonia.Controls/Documents/InlineCollection.cs
  2. 19
      src/Avalonia.Controls/TextBlock.cs

52
src/Avalonia.Controls/Documents/InlineCollection.cs

@ -89,55 +89,49 @@ namespace Avalonia.Controls.Documents
} }
public override void Add(Inline inline)
{
if (InlineHost is TextBlock textBlock && !string.IsNullOrEmpty(textBlock._text))
{
base.Add(new Run(textBlock._text));
textBlock._text = null;
}
base.Add(inline);
}
/// <summary> /// <summary>
/// Add a text segment to the collection. /// Adds a text segment to the collection.
/// <remarks> /// <remarks>
/// For non complex content this appends the text to the end of currently held text. /// For non complex content this appends the text to the end of currently held text.
/// For complex content this adds a <see cref="Run"/> to the collection. /// For complex content this adds a <see cref="Run"/> to the collection.
/// </remarks> /// </remarks>
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text">The to be added text.</param>
public void Add(string text) public void Add(string text)
{ {
AddText(text); AddText(text);
} }
public override void Add(Inline inline) /// <summary>
{ /// Adds a control wrapped inside a <see cref="InlineUIContainer"/> to the collection.
OnAdd(); /// </summary>
/// <param name="control">The to be added control.</param>
base.Add(inline); public void Add(IControl control)
}
public void Add(IControl child)
{ {
OnAdd(); Add(new InlineUIContainer(control));
base.Add(new InlineUIContainer(child));
} }
private void AddText(string text) internal void AddText(string text)
{ {
if (LogicalChildren is TextBlock textBlock && !textBlock.HasComplexContent) if (InlineHost is TextBlock textBlock && !textBlock.HasComplexContent)
{ {
textBlock._text += text; textBlock._text += text;
} }
else else
{ {
base.Add(new Run(text)); Add(new Run(text));
}
}
private void OnAdd()
{
if (LogicalChildren is TextBlock textBlock)
{
if (!textBlock.HasComplexContent && !string.IsNullOrEmpty(textBlock._text))
{
base.Add(new Run(textBlock._text));
textBlock._text = null;
}
} }
} }

19
src/Avalonia.Controls/TextBlock.cs

@ -597,23 +597,12 @@ namespace Avalonia.Controls
protected virtual void SetText(string? text) protected virtual void SetText(string? text)
{ {
if (Inlines != null && Inlines.Count > 0) if (HasComplexContent)
{
var oldValue = Inlines.Text;
if (!string.IsNullOrEmpty(text))
{
Inlines.Add(text);
}
text = Inlines.Text;
RaisePropertyChanged(TextProperty, oldValue, text);
}
else
{ {
SetAndRaise(TextProperty, ref _text, text); Inlines?.Clear();
} }
SetAndRaise(TextProperty, ref _text, text);
} }
/// <summary> /// <summary>

Loading…
Cancel
Save