美文网首页工作生活
利用行为Behavior和依赖属性实现WPF TextBox的水

利用行为Behavior和依赖属性实现WPF TextBox的水

作者: 小亮光 | 来源:发表于2019-07-01 19:17 被阅读0次

    Behavior:行为,是WPF中一种用于扩展控件的一种机制。

    DependencyProperty:依赖属性,是WPF的一个核心概念,可用于向控件传递数据,数据绑定,数据校验等。

    实现步骤:

    1. 在工程中添加引用System.Windows.Interactivity,以支持behavior

    2. 创建作用于TextBox上的Behavior类文件TextBoxWatermarkBehavior.cs,在其头部使用命名空间:

    using System.Windows.Interactivity;

    1. TextBoxWatermarkBehavior类的代码如下:
    public class TextBoxWatermarkBehavior : Behavior<TextBox>
        {
            public static readonly DependencyProperty WatermarkProperty;
            static TextBoxWatermarkBehavior()
            {
                WatermarkProperty = DependencyProperty.Register("Watermark", typeof(string), typeof(TextBoxWatermarkBehavior), new PropertyMetadata(default(string)));
            }
    
            bool _hasContent = false;
            protected override void OnAttached()
            {
                base.OnAttached();
                var textBox = AssociatedObject;
                textBox.Loaded += (o, e) =>
                {
                    if (!string.IsNullOrEmpty(textBox.Text))
                    {
                        _hasContent = true;
                    }
                    else
                    {
                        _hasContent = false;
                        if (!String.IsNullOrEmpty(Watermark))
                        {
                            textBox.Foreground = Brushes.Gray;
                            textBox.Text = Watermark;
                            textBox.GotFocus += TextBox_GotFocus;
                            textBox.LostFocus += TextBox_LostFocus;
                        }
                    }
                };
            }
    
            private void TextBox_LostFocus(object sender, RoutedEventArgs e)
            {
                var textBox = sender as TextBox;
                if (string.IsNullOrEmpty(textBox.Text))
                {
                    _hasContent = false;
                    if (!string.IsNullOrEmpty(Watermark))
                    {
                        textBox.Text = Watermark;
                        textBox.Foreground = Brushes.Gray;
                    }
                }
                else
                {
                    _hasContent = true;
                }
                
            }
    
            private void TextBox_GotFocus(object sender, RoutedEventArgs e)
            {
                var textBox = sender as TextBox;
                if (!string.IsNullOrEmpty(Watermark) && !_hasContent)
                {
                    textBox.Text = "";
                    textBox.Foreground = Brushes.Black;
                }
            }
    
            public string Watermark
            {
                get
                {
                    return GetValue(WatermarkProperty) as string;
                }
                set
                {
                    SetValue(WatermarkProperty, value);
                }
            }
    
            protected override void OnDetaching()
            {
                base.OnDetaching();
            }
        }
    

    测试Watermark, MainWindow.xaml:

    <Window
        x:Class="WpfApp2.MainWindow"
        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:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:local="clr-namespace:WpfApp2"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="300"
        Height="200"
        mc:Ignorable="d">
        <Grid Margin="20">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="60" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock  Grid.Row="0" Grid.Column="0"  VerticalAlignment="Center">无水印</TextBlock>
            <TextBox  Grid.Row="0"  Grid.Column="1" Height="30" HorizontalAlignment="Stretch" />
            <TextBlock  Grid.Row="1"  Grid.Column="0"  VerticalAlignment="Center">有水印</TextBlock>
            <TextBox  Grid.Row="1" Grid.Column="1" Height="30">
                <i:Interaction.Behaviors>
                    <local:TextBoxWatermarkBehavior Watermark="Please input" />
                </i:Interaction.Behaviors>
            </TextBox>
        </Grid>
    </Window>
    

    最终效果:


    Animation1111.gif

    相关文章

      网友评论

        本文标题:利用行为Behavior和依赖属性实现WPF TextBox的水

        本文链接:https://www.haomeiwen.com/subject/rnmncctx.html