wpf之附加属性

发布于:2025-09-03 ⋅ 阅读:(21) ⋅ 点赞:(0)

前言

附加属性是 WPF 中一个非常强大和独特的概念。简单来说,它允许一个对象为另一个在其本身类定义中未定义的属性赋值。

1、定义附加属性

定义一个Watermark的附加属性,该属性的作用是将TextBox的附加属性改变时,TextBox的字体颜色改成灰色。

 class WatermarkService
    {
        // 1. 注册一个名为 Watermark 的附加属性
        public static readonly DependencyProperty WatermarkProperty =
            DependencyProperty.RegisterAttached(
            "Watermark", // 属性名
            typeof(string), // 属性类型
            typeof(WatermarkService), // 所有者类型
            new PropertyMetadata(string.Empty, OnWatermarkChanged) // 元数据,包含默认值和回调方法
        );

        // 2. 标准的 Get 访问器
        public static string GetWatermark(DependencyObject obj)
        {
            return (string)obj.GetValue(WatermarkProperty);
        }

        // 3. 标准的 Set 访问器
        public static void SetWatermark(DependencyObject obj, string value)
        {
            obj.SetValue(WatermarkProperty, value);
        }

        // 4. 属性值改变时的回调方法
        private static void OnWatermarkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            // 我们期望这个属性只用在 TextBox 上
            if (d is TextBox textBox)
            {
                string newWatermark = (string)e.NewValue;
                string oldWatermark = (string)e.OldValue;

                // 这里可以实现具体的逻辑,例如:
                // - 当 TextBox 文本为空时显示水印
                // - 当获得焦点时隐藏水印
                // 通常需要订阅 GotFocus、LostFocus 等事件。
                // 这是一个简化示例,实际实现会更复杂。

                if (string.IsNullOrEmpty(textBox.Text))
                {
                    textBox.Text = newWatermark;
                    textBox.Foreground = Brushes.White; // 将水印文字设置为灰色
                }
            }
        }
    }

2、xaml代码

<Window x:Class="wpf之附加属性.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf之附加属性"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel Orientation="Vertical" >
            <Button Height=" 100" Background="Blue"  />
            <TextBox x:Name="tbx_test"  Background="Red"  local:WatermarkService.Watermark="我是附加属性"
                 Width="200" Height="30"/>
            </StackPanel >
    </Grid>
</Window>

3、运行效果

在这里插入图片描述

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》


网站公告

今日签到

点亮在社区的每一天
去签到