首页 > 代码库 > 自定义 匹配文本框

自定义 匹配文本框

<UserControl x:Class="PhoneApp4.CtrlView.MatchTextView"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    mc:Ignorable="d" x:Name="this"    FontFamily="{StaticResource PhoneFontFamilyNormal}"    FontSize="{StaticResource PhoneFontSizeNormal}"    Foreground="{StaticResource PhoneForegroundBrush}"    d:DesignHeight="480" d:DesignWidth="480">    <Grid x:Name="LayoutRoot" Background="Transparent">        <RichTextBox FontFamily="{Binding FontFamily, ElementName=this}" FontSize="{Binding FontSize, ElementName=this}"                     Foreground="{Binding Foreground, ElementName=this}" FontStyle="{Binding FontStyle, ElementName=this}">            <Paragraph x:Name="paragraph">                            </Paragraph>        </RichTextBox>    </Grid></UserControl>
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Navigation;using Microsoft.Phone.Controls;using Microsoft.Phone.Shell;using System.Windows.Documents;using System.Windows.Media;namespace PhoneApp4.CtrlView{    public partial class MatchTextView : UserControl    {        public MatchTextView()        {            InitializeComponent();        }        public static readonly DependencyProperty TextProperty =                               DependencyProperty.Register("Text", typeof(string), typeof(MatchTextView),                               new PropertyMetadata(string.Empty, OnTextChanged));        public string Text        {            get { return (string)(base.GetValue(TextProperty)); }            set { base.SetValue(TextProperty, value); }        }        private static void OnTextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)        {            MatchTextView ctrl = sender as MatchTextView;            ctrl.OnBufChanged((string)(args.NewValue));        }        private void OnBufChanged(string buf)        {            OnUpdataUi(buf, MatchText);        }        public static readonly DependencyProperty MatchTextProperty =                               DependencyProperty.Register("MatchText", typeof(string), typeof(MatchTextView),                               new PropertyMetadata(string.Empty, OnMatchTextChanged));        public string MatchText        {            get { return (string)(base.GetValue(MatchTextProperty)); }            set { base.SetValue(MatchTextProperty, value); }        }        private static void OnMatchTextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)        {            MatchTextView ctrl = sender as MatchTextView;            ctrl.OnMatchBufChanged((string)(args.NewValue));        }        private void OnMatchBufChanged(string matchBuf)        {            OnUpdataUi(Text, matchBuf);        }        private void OnUpdataUi(string text, string matchText)        {            List<KeyValuePair<bool, string>> lst = new List<KeyValuePair<bool, string>>();            if (!string.IsNullOrEmpty(text))            {                if (!string.IsNullOrEmpty(matchText) && text.Contains(matchText))                {                    do                    {                        int index = text.IndexOf(matchText);                        if (index == 0)                        {                            lst.Add(new KeyValuePair<bool, string>(true, matchText));                            text = text.Substring(matchText.Length);                        }                        else if (index > 0)                        {                            string buf = text.Substring(0, index);                            lst.Add(new KeyValuePair<bool, string>(false, buf));                            lst.Add(new KeyValuePair<bool, string>(true, matchText));                            text = text.Substring(index + matchText.Length);                        }                    } while (text.Contains(matchText));                    if (!string.IsNullOrEmpty(text))                    {                        lst.Add(new KeyValuePair<bool, string>(false, text));                    }                }                else                {                    lst.Add(new KeyValuePair<bool, string>(false, text));                }            }            Add(lst);        }        private void Add(List<KeyValuePair<bool, string>> lst)        {            this.paragraph.Inlines.Clear();            for (int i = 0; i < lst.Count; i++)            {                Run run = new Run();                run.Text = lst[i].Value;                if (lst[i].Key)                {                    run.Foreground = MatchForeground;                    run.FontSize = MatchFontSize;                    run.FontStyle = MatchFontStyle;                }                this.paragraph.Inlines.Add(run);            }        }        public static readonly DependencyProperty MatchForegroundProperty =                               DependencyProperty.Register("MatchForeground", typeof(Brush), typeof(MatchTextView),                               new PropertyMetadata(new SolidColorBrush(Colors.Yellow), OnMatchForegroundChanged));        public Brush MatchForeground        {            get { return (Brush)(base.GetValue(MatchForegroundProperty)); }            set { base.SetValue(MatchForegroundProperty, value); }        }        private static void OnMatchForegroundChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)        {            MatchTextView ctrl = sender as MatchTextView;            Brush brush = args.NewValue as Brush;            if (brush != null)            {                ctrl.foregroundChanged(brush);            }        }        private void foregroundChanged(Brush foreground)        {            OnStyleChanged(foreground, MatchFontSize, MatchFontStyle);        }        public static readonly DependencyProperty MatchFontSizeProperty =                               DependencyProperty.Register("MatchFontSize", typeof(double), typeof(MatchTextView),                               new PropertyMetadata((double)(App.Current.Resources["PhoneFontSizeNormal"]), OnFontSizeChanged));        public double MatchFontSize        {            get { return (double)(base.GetValue(MatchFontSizeProperty)); }            set { base.SetValue(MatchFontSizeProperty, value); }        }        private static void OnFontSizeChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)        {            MatchTextView ctrl = sender as MatchTextView;            ctrl.fontSizeChanged((double)(args.NewValue));        }        private void fontSizeChanged(double fontsize)        {            OnStyleChanged(MatchForeground, fontsize, MatchFontStyle);        }        public static readonly DependencyProperty MatchFontStyleProperty =                               DependencyProperty.Register("MatchFontStyle", typeof(FontStyle), typeof(MatchTextView),                               new PropertyMetadata(FontStyles.Normal, OnFontStyleChanged));        public FontStyle MatchFontStyle        {            get { return (FontStyle)(base.GetValue(MatchFontStyleProperty)); }            set { base.SetValue(MatchFontStyleProperty, value); }        }        private static void OnFontStyleChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)        {            MatchTextView ctrl = sender as MatchTextView;            ctrl.fontStyleChanged((FontStyle)(args.NewValue));        }        private void fontStyleChanged(FontStyle fontstyle)        {            OnStyleChanged(MatchForeground, MatchFontSize, fontstyle);        }        private void OnStyleChanged(Brush brush, double fontsize, FontStyle fontstyle)        {            for (int i = 0; i < paragraph.Inlines.Count; i++)            {                if (!string.IsNullOrEmpty((paragraph.Inlines[i] as Run).Text) && (paragraph.Inlines[i] as Run).Text.Equals(MatchText))                {                    (paragraph.Inlines[i] as Run).Foreground = brush;                    (paragraph.Inlines[i] as Run).FontSize = fontsize;                    (paragraph.Inlines[i] as Run).FontStyle = fontstyle;                }            }        }    }}//public double FontSize { get; set; }//public FontStretch FontStretch { get; set; }//public FontStyle FontStyle { get; set; }//       Italic    Normal//public FontWeight FontWeight { get; set; }//public Brush Foreground { get; set; }

使用案例:

<CtrlView:MatchTextView Grid.Row="1" Margin="30,20,30,0" Text="19781031" FontSize="30" MatchFontSize="40" MatchText="1" MatchForeground="YellowGreen"/>