zoukankan      html  css  js  c++  java
  • WPF系列 —— 控件添加依赖属性(转)

    WPF系列 —— 控件添加依赖属性

    依赖属性的概念,用途 ,如何新建与使用。本文用做一个自定义TimePicker控件来演示WPF的依赖属性的简单应用。

    先上TimePicker的一个效果图。

    GIF

    概念 和 用途:依赖属性是对传统.net 属性的一种封装,使一个传统.net属性支持 WPF 中的 数据绑定、动画、样式 等功能。

    新建:任意代码代码文件中 ,输入 propdp 再双击tab键。生成如下的代码块。

         MyProperty: 依赖属性的名称; ownerclass: 当前依赖属性绑定的所有类; new PropertyMetadata 是依赖属性的初始化对象,这里0代表默认值。

    复制代码
    public int MyProperty
    {
        get { return (int)GetValue(MyPropertyProperty); }
        set { SetValue(MyPropertyProperty, value); }
    }
    
    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));
    复制代码

    使用:这里我们使用绑定绑定,稍后使用自定义控件的Time属性来介绍。

    如何使用依赖属性构建一个带绑定的TimePicker自定义控件

    新建一个项目名称为DependencyPropertyDemo的WPF 项目 image,新建一个TimePicker的自定义控件。Xaml布局如下:

    复制代码
    <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="9*"/>
                <ColumnDefinition Width="24"/>
                <ColumnDefinition Width="10*"/>
            </Grid.ColumnDefinitions>
            <ComboBox Name="cbbHour" Grid.Column="0"/>
            <Label Content=":" Grid.Column="1"/>
            <ComboBox Name="cbbMinute" Grid.Column="2"/>
        </Grid>
    复制代码

    BehindCode新建一个名称为Time的依赖属性,如下:

    复制代码
    public string Time
            {
                get { return (string)GetValue(TimeProperty); }
                set { SetValue(TimeProperty, value); }
            }
    
            public static readonly DependencyProperty TimeProperty =
                DependencyProperty.Register("Time",
                    typeof(string),
                    typeof(TimePicker),
                    new PropertyMetadata(defaultValue: "00:00", 
                        propertyChangedCallback: null,
                        coerceValueCallback: coerceValueCallback));
    
            private static object coerceValueCallback(DependencyObject d, object baseValue)
            {
                if (baseValue != null)
                {
                    var control = d as TimePicker;
                    var times = baseValue.ToString().Split(':');
                    control.cbbHour.SelectedItem = times[0];
                    control.cbbMinute.SelectedItem = times[1];
                    return baseValue.ToString();
                }
                return baseValue;
            }
    复制代码

    这里详细介绍一下PropertyMetadata的三个参数:defaultValue:默认值,不用介绍了;propertyChangedCallback:属性变化后的通知事件,这里不需要任何通知,所以传入null值;coerceValueCallback:这是属性值新值绑定时,通知事件,这里使用得到的值来给控件赋值。到这里Time依赖属性也就完成一半了。

    TimePicker属性依赖属性Time的绑定

    绑定方式很简单,如下图。若Time是一个普通的.net属性而非依赖属性的话,是不能这样使用绑定方式的。

    <local:TimePicker HorizontalAlignment="Left" Margin="137,38,0,0" VerticalAlignment="Top" Width="161"
                              Time="{Binding StartTime,Mode=TwoWay}"/>

    假设添加在TimePicker后台添加一个Code的普通属性,使用绑定的话,会出现如下的状况。

    image

     

    后话总结

    依赖属性使用是有一定限制的,就是他注册的类对象,也就是上文的ownerclass必须继承DependencyObject 这个基类,不过不用担心,WPF大部分元素都间接的集成这个基类。

    本文实现的TimePicker控件可以在一些情况下解决WPF下没有Time选择控件的问题。

    Demo下载

    如果,您认为阅读这篇博客让您有些收获,请点击下面的【推荐】和 【关注】按钮,感谢大家的支持,我是朝兮兮。眨眼

  • 相关阅读:
    蓝桥杯国赛--四阶幻方清晰易懂(dfs+剪枝,stl)
    蓝桥杯---九宫重排(典型bfs)
    快速排序算法细致总结!!!
    Topsis优劣解距离分析法
    golang变量的定义
    golang
    erlang的优缺点
    mongrel代码注解
    取石块 解题报告
    军队 解题报告
  • 原文地址:https://www.cnblogs.com/lsgsanxiao/p/11330506.html
Copyright © 2011-2022 走看看