wpf 依赖项属性

UI软件中经常会用到大量的控件,而每一个控件都是一个对象,每一个类都会有大量的属性,如果没创建一个对象就将所有的属性都创建出来,无非会占用大量的内存,wpf使用依赖项属性来提升了性能。

查看任何一个控件的定义,以button为例,都会发现类内包含大量的依赖性属性定义,注意到其中DependencyProperty都是static readonly的,而每一个依赖项属性都会有一个去掉“Property”的CLR属性和他对应,而我们在xaml中访问的都是CLR属性。

        public static readonly DependencyProperty IsCancelProperty;
        public static readonly DependencyProperty IsDefaultedProperty;
        public static readonly DependencyProperty IsDefaultProperty;

        public bool IsCancel { get; set; }
        public bool IsDefault { get; set; }
        public bool IsDefaulted { get; }


如果我们自定义一个依赖项属性,方法是这样的

        public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(ProvienceInfo));

        //private string name;
        public string Name
        {
            set
            {
                //if (name != value)
                {
                    SetValue(NameProperty, value);
                }
            }
            get
            {
                return GetValue(NameProperty).ToString();
            }
        }

注意到使用DependencyProperty的静态方法register将该属性注册到DependencyProperty上,DependencyProperty类的内部包含一个hashtable,所有的依赖项属性都存在这个哈希表中,哈希表的key为由DependencyProperty的name和ownertype组成的类,且使用name+ownertype作为的哈希值,这样就可以确保每个key是不重复的

private class FromNameKey{

    //Fields    private int _hashCode;

    privatestring _name;

   private Type_ownerType;

 

   // Methods

     publicFromNameKey(string name, Type ownerType)

    {

       this._name = name;

       this._ownerType = ownerType;

       this._hashCode =

       this._name.GetHashCode() ^

       this._ownerType.GetHashCode();

   }    //省略代码...............}

依赖项属性到底是怎么样节约内存的呢,由于我们创建控件对象时只会设置很少一部分属性,大部分属性都是使用默认值,默认值也就是所有的对象都是一样的,那就可以使用静态属性来表示了,上面提到的存储依赖项属性的hashtable就发挥作用了,clr将所有没有设置的属性存放在这个hashtable中,对于设置了值的属性,则会为这个对象创建一个数组,类型为EffectiveValueEntry,包含了一个属性的index,dependencyproperty提供了一个方法getglobalindex来获取此属性在hashtable中的位置,value当然就可以在此取出。

internal struct EffectiveValueEntry 

{  

    internal int PropertyIndex { get; set; }  

    internal object Value { get; set; } 


这也是为什么依赖项属性注册为static readonly的却可以修改的原因。

依赖项属性还给我们提供了什么其他好处

数据绑定:当我们绑定到数据源时,如果数据源的变更要想通知到UI,就需要实现inotifypropertychange接口,但如果将绑定源声明为依赖项属性,则可以直接通知更新UI。
资源的引用:还没搞懂,需要查

本地值:动画改变的属性只是改变临时变量,并未改变属性值

附加属性和附加事件:

附加属性是全局的依赖属性,依赖属性属于某个类,而附加属性可以用在其他对象上,最简单,如Grid.row可以直接在Grid内的控件上设置

如果需要手动添加附加属性,方法和依赖属性差不多,使用DependencyProperty.RegisterAttached方法

附加事件我的理解和附加属性差不多,也是全局的事件,可以附加到容器下的所有相应的控件上,如

<Grid ButtonBase.Click="bt_Click" Selector.SelectionChanged="Grid_SelectionChanged">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <ComboBox  Grid.Row="0" Name="ProvienceComboBox" Height="30" ItemsSource="{Binding Path=Proviences}" SelectionChanged="ComboBox_SelectionChanged"  
                  SelectedValuePath="Id" DisplayMemberPath="Name" SelectedIndex="0">
        </ComboBox>
        <ComboBox Grid.Row="1" Name="CityComboBox" Height="30" SelectedIndex="0"  SelectedValuePath="Id" DisplayMemberPath="Name">
        </ComboBox>
        <Button Grid.Row="2" Name="bt" Height="30" Width="60" Content="update" />
        <Button Grid.Row="3"  Height="30" Width="60" Content="update" />

    </Grid>

这些事件会沿着视觉树向子元素寻找,直到找到相应的控件,并通知其相应事件,但后台出来事件的sender为grid,可以通过e.originalsource来查看事件的触发控件。


内容概要:本文系统研究了基于CNN-SVM的卷积神经网络与支持向量机融合的数据分类预测方法,聚焦其在工业故障识别中的应用,提供了完整的Matlab代码实现。通过CNN提取输入数据的深层空间特征,再由SVM进行高精度分类,充分发挥两者优势,有效提升了故障识别的准确性、鲁棒性与泛化能力。该方法特别适用于处理电力系统、机械设备等领域的高维、非线性、强噪声监测数据,在变压器故障诊断、轴承缺陷识别等场景中具有重要应用价值。文档还整合了机器学习、深度学习、图像处理、路径规划、电力系统优化等多个前沿科研方向的技术资源,配套大量Matlab/Simulink仿真案例与Python代码,全面支持科研复现与工程实践。; 适合人群:具备一定编程基础,熟练掌握Matlab或Python语言,从事电气工程、自动化、人工智能、机械故障诊断等相关领域研究的研发人员及高校研究生; 使用场景及目标:① 实现工业设备的状态监测与多类别故障分类;② 深入理解CNN与SVM融合模型的设计原理与工程实现细节;③ 借助所提供的丰富算法案例开展科研复现、模型优化与系统仿真验证; 阅读建议:建议按照文档目录结构系统化学习,结合百度网盘提供的完整代码资源进行动手实践,重点关注CNN特征提取层与SVM分类器之间的数据接口设计与参数调优策略,同时可延伸学习文中涉及的其他智能算法及其在电力系统、信号处理等领域的交叉应用,全面提升科研创新能力。
内容概要:本文围绕“考虑电动汽车灵活性的微网多时间尺度协调调度”展开研究,提出了一种基于Matlab代码实现的优化调度模型。该模型深入挖掘电动汽车作为灵活可控负荷与分布式储能单元的双重潜力,通过构建日前、日内及实时等多时间尺度的协调调度机制,有效应对光伏发电的间歇性与波动性,实现微电网内部功率的动态平衡。研究综合集成了电动汽车集群的有序充放电管理、储能系统协同优化与多种需求响应策略,建立了以系统运行成本最小化、可再生能源消纳最大化及供电可靠性最优化为目标的综合数学模型,并采用Matlab进行仿真求解。结果表明,所提方法能显著平抑功率波动,优化源-荷-储资源的时空配置,提升微电网运行的经济性与稳定性。; 适合人群:电气工程、能源与动力工程、控制科学与工程、电力系统及其自动化等专业的研究生、高校科研人员,以及从事智能电网、微电网规划、电动汽车与电网互动(V2G)技术研发的工程技术人员。; 使用场景及目标:①研究高比例可再生能源接入背景下,含大规模电动汽车的微电网协同优化运行策略;②掌握多时间尺度滚动优化的建模思想与Matlab/Simulink仿真技术;③探索电动汽车聚合商参与电力市场辅助服务的可行路径与效益评估方法; 阅读建议:建议读者结合提供的Matlab代码进行复现与调试,深入理解目标函数构建、约束条件处理及求解器调用等关键技术环节,可尝试引入电池老化模型、用户出行行为不确定性等更贴近实际的因素,以深化研究的实用性与前瞻性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值