using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Common.Wpf.HtmlLabelControl { /// /// Interaction logic for HtmlLabel.xaml /// public partial class HtmlLabel : UserControl { private Collection _textLines; public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(HtmlLabel), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsRender)); public HtmlLabel() { InitializeComponent(); } protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) { base.OnPropertyChanged(e); switch (e.Property.Name) { case "FontFamily": case "FontSize": case "Foreground": // Force the control to re-parse Text = Text; break; case "HorizontalContentAlignment": case "VerticalContentAlignment": case "Padding": InvalidateVisual(); break; } } protected override void OnRender(DrawingContext drawingContext) { if (string.IsNullOrEmpty(Text)) return; Point drawPoint = new Point(Padding.Left, Padding.Top); switch (VerticalContentAlignment) { case VerticalAlignment.Bottom: drawPoint.Y = ActualHeight - Padding.Bottom; foreach (TextLine line in _textLines) { drawPoint.Y -= line.Height; } break; case VerticalAlignment.Center: double totalHeight = 0; foreach (TextLine line in _textLines) { totalHeight += line.Height; } drawPoint.Y = ((ActualHeight - (Padding.Top + Padding.Bottom)) / 2) - (totalHeight / 2); break; } foreach (TextLine line in _textLines) { if (drawPoint.Y < 0) { drawPoint.Y += line.Height; continue; } drawPoint.X = Padding.Left; switch (HorizontalContentAlignment) { case HorizontalAlignment.Right: drawPoint.X = ActualWidth - line.Width - Padding.Right; break; case HorizontalAlignment.Center: drawPoint.X = ((ActualWidth - (Padding.Left + Padding.Right)) / 2) - (line.Width / 2); break; } foreach (TextFragment fragment in line.FragmentList) { drawingContext.DrawText(fragment.FormattedText, drawPoint); drawPoint.X += fragment.FormattedText.WidthIncludingTrailingWhitespace; } drawPoint.Y += line.Height; } } public string Text { get { return (string) GetValue(TextProperty); } set { TextParser textParser = new TextParser(); _textLines = textParser.Parse(this, value); SetValue(TextProperty, value); } } } }