using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Tango.SharedUI.Controls { [ContentProperty(nameof(Text))] public class FastTextBlock : Control { private FormattedText _formattedText; static FastTextBlock() { } public FastTextBlock() { Loaded += FastTextBlock_Loaded; DependencyPropertyDescriptor fontFamilyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(FastTextBlock.FontFamilyProperty, typeof(FastTextBlock)); fontFamilyPropertyDescriptor.AddValueChanged(this, OnPropertyChangedInit); DependencyPropertyDescriptor fontSizePropertyDescriptor = DependencyPropertyDescriptor.FromProperty(FastTextBlock.FontSizeProperty, typeof(FastTextBlock)); fontSizePropertyDescriptor.AddValueChanged(this, OnPropertyChangedInit); DependencyPropertyDescriptor fontWeightPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(FastTextBlock.FontWeightProperty, typeof(FastTextBlock)); fontWeightPropertyDescriptor.AddValueChanged(this, OnPropertyChangedInit); DependencyPropertyDescriptor ForegroundPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(FastTextBlock.ForegroundProperty, typeof(FastTextBlock)); ForegroundPropertyDescriptor.AddValueChanged(this, OnPropertyChangedInit); } private void OnPropertyChangedInit(object sender, EventArgs e) { Init(); } private void FastTextBlock_Loaded(object sender, RoutedEventArgs e) { Init(); } public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof(string), typeof(FastTextBlock), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender, (o, e) => ((FastTextBlock)o).TextPropertyChanged((string)e.NewValue))); private void TextPropertyChanged(string text) { Init(); } private void Init() { if (Text != null) { var typeface = new Typeface( FontFamily, FontStyle, FontWeight, FontStretch); _formattedText = new FormattedText( Text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, FontSize, Foreground); } } public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } protected override void OnRender(DrawingContext drawingContext) { if (_formattedText != null) { drawingContext.DrawText(_formattedText, new Point()); } } protected override Size MeasureOverride(Size constraint) { return _formattedText != null ? new Size(_formattedText.Width, _formattedText.Height) : new Size(); } } }