committed by
GitHub
19 changed files with 629 additions and 318 deletions
@ -0,0 +1,11 @@ |
|||||
|
using Avalonia.LogicalTree; |
||||
|
|
||||
|
namespace Avalonia.Controls.Documents |
||||
|
{ |
||||
|
internal interface IInlineHost : ILogical |
||||
|
{ |
||||
|
void AddVisualChild(IControl child); |
||||
|
|
||||
|
void Invalidate(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,125 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Text; |
||||
|
using Avalonia.Media; |
||||
|
using Avalonia.Media.TextFormatting; |
||||
|
using Avalonia.Metadata; |
||||
|
using Avalonia.Utilities; |
||||
|
|
||||
|
namespace Avalonia.Controls.Documents |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// InlineUIContainer - a wrapper for embedded UIElements in text
|
||||
|
/// flow content inline collections
|
||||
|
/// </summary>
|
||||
|
public class InlineUIContainer : Inline |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Defines the <see cref="Child"/> property.
|
||||
|
/// </summary>
|
||||
|
public static readonly StyledProperty<IControl> ChildProperty = |
||||
|
AvaloniaProperty.Register<InlineUIContainer, IControl>(nameof(Child)); |
||||
|
|
||||
|
static InlineUIContainer() |
||||
|
{ |
||||
|
BaselineAlignmentProperty.OverrideDefaultValue<InlineUIContainer>(BaselineAlignment.Top); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of InlineUIContainer element.
|
||||
|
/// </summary>
|
||||
|
/// <remarks>
|
||||
|
/// The purpose of this element is to be a wrapper for UIElements
|
||||
|
/// when they are embedded into text flow - as items of
|
||||
|
/// InlineCollections.
|
||||
|
/// </remarks>
|
||||
|
public InlineUIContainer() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes an InlineBox specifying its child UIElement
|
||||
|
/// </summary>
|
||||
|
/// <param name="child">
|
||||
|
/// UIElement set as a child of this inline item
|
||||
|
/// </param>
|
||||
|
public InlineUIContainer(IControl child) |
||||
|
{ |
||||
|
Child = child; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The content spanned by this TextElement.
|
||||
|
/// </summary>
|
||||
|
[Content] |
||||
|
public IControl Child |
||||
|
{ |
||||
|
get => GetValue(ChildProperty); |
||||
|
set => SetValue(ChildProperty, value); |
||||
|
} |
||||
|
|
||||
|
internal override void BuildTextRun(IList<TextRun> textRuns) |
||||
|
{ |
||||
|
if(InlineHost == null) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
((ISetLogicalParent)Child).SetParent(InlineHost); |
||||
|
|
||||
|
InlineHost.AddVisualChild(Child); |
||||
|
|
||||
|
textRuns.Add(new InlineRun(Child, CreateTextRunProperties())); |
||||
|
} |
||||
|
|
||||
|
internal override void AppendText(StringBuilder stringBuilder) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
private class InlineRun : DrawableTextRun |
||||
|
{ |
||||
|
public InlineRun(IControl control, TextRunProperties properties) |
||||
|
{ |
||||
|
Control = control; |
||||
|
Properties = properties; |
||||
|
} |
||||
|
|
||||
|
public IControl Control { get; } |
||||
|
|
||||
|
public override TextRunProperties? Properties { get; } |
||||
|
|
||||
|
public override Size Size |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
if (!Control.IsMeasureValid) |
||||
|
{ |
||||
|
Control.Measure(Size.Infinity); |
||||
|
} |
||||
|
|
||||
|
return Control.DesiredSize; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public override double Baseline |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
double baseline = Size.Height; |
||||
|
double baselineOffsetValue = Control.GetValue<double>(TextBlock.BaselineOffsetProperty); |
||||
|
|
||||
|
if (!MathUtilities.IsZero(baselineOffsetValue)) |
||||
|
{ |
||||
|
baseline = baselineOffsetValue; |
||||
|
} |
||||
|
|
||||
|
return -baseline; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public override void Draw(DrawingContext drawingContext, Point origin) |
||||
|
{ |
||||
|
Control.Arrange(new Rect(origin, Size)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue