zoukankan      html  css  js  c++  java
  • 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下载

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

  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/zhaoxixi/p/4947996.html
Copyright © 2011-2022 走看看