123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- using System;
- using System.ComponentModel;
- using System.Windows;
- using System.Windows.Documents;
- using System.Windows.Media;
- using HandyControl.Data;
- using HandyControl.Tools.Helper;
- namespace HandyControl.Controls;
- public class SimpleText : FrameworkElement
- {
- private FormattedText _formattedText;
- static SimpleText()
- {
- SnapsToDevicePixelsProperty.OverrideMetadata(typeof(SimpleText), new FrameworkPropertyMetadata(ValueBoxes.TrueBox));
- UseLayoutRoundingProperty.OverrideMetadata(typeof(SimpleText), new FrameworkPropertyMetadata(ValueBoxes.TrueBox));
- }
- public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
- nameof(Text), typeof(string), typeof(SimpleText), new FrameworkPropertyMetadata(
- string.Empty,
- FrameworkPropertyMetadataOptions.AffectsMeasure |
- FrameworkPropertyMetadataOptions.AffectsRender, OnFormattedTextInvalidated));
- public string Text
- {
- get => (string) GetValue(TextProperty);
- set => SetValue(TextProperty, value);
- }
- public static readonly DependencyProperty TextAlignmentProperty = DependencyProperty.Register(
- nameof(TextAlignment), typeof(TextAlignment), typeof(SimpleText),
- new PropertyMetadata(default(TextAlignment), OnFormattedTextUpdated));
- public TextAlignment TextAlignment
- {
- get => (TextAlignment) GetValue(TextAlignmentProperty);
- set => SetValue(TextAlignmentProperty, value);
- }
- public static readonly DependencyProperty TextTrimmingProperty = DependencyProperty.Register(
- nameof(TextTrimming), typeof(TextTrimming), typeof(SimpleText),
- new PropertyMetadata(default(TextTrimming), OnFormattedTextInvalidated));
- public TextTrimming TextTrimming
- {
- get => (TextTrimming) GetValue(TextTrimmingProperty);
- set => SetValue(TextTrimmingProperty, value);
- }
- public static readonly DependencyProperty TextWrappingProperty = DependencyProperty.Register(
- nameof(TextWrapping), typeof(TextWrapping), typeof(SimpleText),
- new PropertyMetadata(TextWrapping.NoWrap, OnFormattedTextInvalidated));
- public TextWrapping TextWrapping
- {
- get => (TextWrapping) GetValue(TextWrappingProperty);
- set => SetValue(TextWrappingProperty, value);
- }
- public static readonly DependencyProperty ForegroundProperty = DependencyProperty.Register(
- nameof(Foreground), typeof(Brush), typeof(SimpleText), new PropertyMetadata(Brushes.Black, OnFormattedTextUpdated));
- public Brush Foreground
- {
- get => (Brush) GetValue(ForegroundProperty);
- set => SetValue(ForegroundProperty, value);
- }
- public static readonly DependencyProperty FontFamilyProperty = TextElement.FontFamilyProperty.AddOwner(
- typeof(SimpleText),
- new FrameworkPropertyMetadata(OnFormattedTextUpdated));
- public FontFamily FontFamily
- {
- get => (FontFamily) GetValue(FontFamilyProperty);
- set => SetValue(FontFamilyProperty, value);
- }
- public static readonly DependencyProperty FontSizeProperty = TextElement.FontSizeProperty.AddOwner(
- typeof(SimpleText),
- new FrameworkPropertyMetadata(OnFormattedTextUpdated));
- [TypeConverter(typeof(FontSizeConverter))]
- public double FontSize
- {
- get => (double) GetValue(FontSizeProperty);
- set => SetValue(FontSizeProperty, value);
- }
- public static readonly DependencyProperty FontStretchProperty = TextElement.FontStretchProperty.AddOwner(
- typeof(SimpleText),
- new FrameworkPropertyMetadata(OnFormattedTextUpdated));
- public FontStretch FontStretch
- {
- get => (FontStretch) GetValue(FontStretchProperty);
- set => SetValue(FontStretchProperty, value);
- }
- public static readonly DependencyProperty FontStyleProperty = TextElement.FontStyleProperty.AddOwner(
- typeof(SimpleText),
- new FrameworkPropertyMetadata(OnFormattedTextUpdated));
- public FontStyle FontStyle
- {
- get => (FontStyle) GetValue(FontStyleProperty);
- set => SetValue(FontStyleProperty, value);
- }
- public static readonly DependencyProperty FontWeightProperty = TextElement.FontWeightProperty.AddOwner(
- typeof(SimpleText),
- new FrameworkPropertyMetadata(OnFormattedTextUpdated));
- public FontWeight FontWeight
- {
- get => (FontWeight) GetValue(FontWeightProperty);
- set => SetValue(FontWeightProperty, value);
- }
- protected override void OnRender(DrawingContext drawingContext) => drawingContext.DrawText(_formattedText, new Point());
- private void EnsureFormattedText()
- {
- if (_formattedText != null || Text == null)
- {
- return;
- }
- _formattedText = TextHelper.CreateFormattedText(Text, FlowDirection,
- new Typeface(FontFamily, FontStyle, FontWeight, FontStretch), FontSize);
- UpdateFormattedText();
- }
- private void UpdateFormattedText()
- {
- if (_formattedText == null)
- {
- return;
- }
- _formattedText.MaxLineCount = TextWrapping == TextWrapping.NoWrap ? 1 : int.MaxValue;
- _formattedText.TextAlignment = TextAlignment;
- _formattedText.Trimming = TextTrimming;
- _formattedText.SetFontSize(FontSize);
- _formattedText.SetFontStyle(FontStyle);
- _formattedText.SetFontWeight(FontWeight);
- _formattedText.SetFontFamily(FontFamily);
- _formattedText.SetFontStretch(FontStretch);
- _formattedText.SetForegroundBrush(Foreground);
- }
- private static void OnFormattedTextUpdated(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var outlinedTextBlock = (SimpleText) d;
- outlinedTextBlock.UpdateFormattedText();
- outlinedTextBlock.InvalidateMeasure();
- outlinedTextBlock.InvalidateVisual();
- }
- private static void OnFormattedTextInvalidated(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var outlinedTextBlock = (SimpleText) d;
- outlinedTextBlock._formattedText = null;
- outlinedTextBlock.InvalidateMeasure();
- outlinedTextBlock.InvalidateVisual();
- }
- protected override Size MeasureOverride(Size availableSize)
- {
- EnsureFormattedText();
- _formattedText.MaxTextWidth = Math.Min(3579139, availableSize.Width);
- _formattedText.MaxTextHeight = Math.Max(0.0001d, availableSize.Height);
- return new Size(_formattedText.Width, _formattedText.Height);
- }
- }
|