Custom textblock that transforms its content to different color

前端 未结 1 536
面向向阳花
面向向阳花 2021-01-26 04:16

I will write a custom textblock that splits its text content. It will make texts diffent colors depending on conditions and the texts will be separated with commas. Commas will

相关标签:
1条回答
  • 2021-01-26 05:04

    Below user control uses an items control to show each token with some random color.

    Usage:

     <local:ColorTextBlock Text="abcd,abcde, abc, abcdef, abc, abcde, "/> 
    

    XAML:

    <UserControl x:Class="WpfApplication1.ColorTextBlock"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:WpfApplication1"
                 mc:Ignorable="d">
    
        <UserControl.Resources>
            <local:TextColorConverter x:Key="TextColorConverter" />
        </UserControl.Resources>
    
        <ItemsControl Name="_itemsControl">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding .}" Foreground="{Binding ., Converter={StaticResource TextColorConverter}}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </UserControl>
    

    Code behind:

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Media;
    
    namespace WpfApplication1
    {
        public partial class ColorTextBlock : UserControl
        {
            public ColorTextBlock()
            {
                InitializeComponent();
            }
    
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
    
            public static readonly DependencyProperty TextProperty = 
                DependencyProperty.Register("Text", typeof(string), typeof(ColorTextBlock), new UIPropertyMetadata(""));
    
            protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
            {
                base.OnPropertyChanged(e);
    
                if (e.Property.Name == "Text")
                {
                    // Below code does not handle text that includes stars. Null check probably needed. 
                    _itemsControl.ItemsSource = Text.Replace(",", "*,*").Split('*');
                }
            }
        }
    
        public class TextColorConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                string text = value as string;
                if (text == ",") return Brushes.Black;
    
                return new SolidColorBrush() { Color = Color.FromArgb(255, (byte)_random.Next(255), (byte)_random.Next(255), (byte)_random.Next(255)) };
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
            private static Random _random = new Random();
        }
    }
    
    0 讨论(0)
提交回复
热议问题