上面说 附加属性。这章节说依赖属性。 所谓依赖属性。白话讲就是添加一个公开的属性。
同样,依赖属性的用法和附加属性的用法差不多。
依赖属性是具有一个get,set的属性,以及反调函数。
首先是声明依赖属性。 依赖属性的用法如同附加属性,值得说明的是依赖属性是附加属性的”爸爸“,附加属性是依赖属性的派生。
声明必须是使用三个关键字:public static readonly (公开的 静态的 只读的)
之后是 依赖属性的 标识:DependencyProperty
合起来就是 :public static readonly DependencecyProperty XXXProperty
之后就是用DependencecyProperty的Register的方法,进行注册。 下面是一个例子
public static readonly DependencyProperty OpenZoomProperty = DependencyProperty.Register ( //name 要注册的依赖项对象的名称 "IsOpenZoom", //propertyType 该属性的类型,作为类型参考 typeof(bool), //ownerType 正在注册依赖项属性的所有者类型,作为类型参考 typeof(UserControl), //defaultMetadata 属性元数据实例。这可以包含一个 PropertyChangedCallback 实现引用。
// 都一个参数:元数据,第二个数据是反调函数【没有函数会自动注册一个】
new PropertyMetadata(false, new PropertyChangedCallback(OnChang))
);
值得说的,依赖属性的表示名必须是XXX加上Property。
下面是 DependencyProperty的Register方法的四个参数的介绍:
名字 | 解释 | 个人理解 |
name | 要注册的依赖项对象的名称。 | 依赖属性公开的名字 |
propertyType | 该属性的类型,作为类型参考 | 这个依赖属性的类型 |
ownerType | 正在注册依赖项属性的所有者类型,作为类型参考 | 这个依赖属性属于谁 |
defaultMetadata | 属性元数据实例。这可以包含一个 PropertyChangedCallback 实现引用。 | 反调函数【是否元数据】 |
***这面说一下依赖属性和附加属性再最后一个方法的反调函数是不同,(依赖属性)一个包含两个参数,(附加属性)一个只有一个。
这个写完声明,说第四个参数会自动注册一个函数。【接上面注册】,所谓反调函数就是你最终对某个内容或者属性的进行操作
//这个是ScrollViewer的是否开启放大效果 private static void OnChang(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { SetPhoto setphoto = (SetPhoto)d; switch ((bool)e.NewValue) { case true: setphoto.scrollViewer.ZoomMode = ZoomMode.Enabled; break; case false: setphoto.scrollViewer.ZoomMode = ZoomMode.Disabled; break; } } }
下面说set get的方法,依赖属性必须有get/set或者二者。 就是一个普通的方法
public bool IsOpenZoom { //get,获取值并且转换其bool get { return (bool)GetValue(OpenZoomProperty); } //或者值 并存储到上面说的依赖属性中 set { SetValue(OpenZoomProperty, value); } }
到这里 一个简单的依赖属性就结束。
下面就是一个简单是例子,用户控件添加依赖属性。
用户控件的目的: 可以放大缩小图片。
依赖属性: 1.是否打开放大效果
2.添加图片到控件Image
3.指示放大倍数
添加一个用户控件 名为SetPhoto
*********************
xaml页面代码:
<UserControl x:Class="水印添加M2.SetPhoto" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:水印添加M2" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid> <ScrollViewer x:Name="scrollViewer" HorizontalScrollBarVisibility="Auto" > <Image x:Name="image"/> </ScrollViewer> </Grid> </UserControl>
之后就是后台代码:
namespace Mode { public sealed partial class SetPhoto : UserControl { public SetPhoto() { this.InitializeComponent(); } public static readonly DependencyProperty OpenZoomProperty = DependencyProperty.Register ( //name 要注册的依赖项对象的名称 "IsOpenZoom", //propertyType 该属性的类型,作为类型参考 typeof(bool), //ownerType 正在注册依赖项属性的所有者类型,作为类型参考 typeof(UserControl), //defaultMetadata 属性元数据实例。这可以包含一个 PropertyChangedCallback 实现引用。 new PropertyMetadata(false, new PropertyChangedCallback(OnChang)) ); public static readonly DependencyProperty SetImageProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(UserControl), new PropertyMetadata(null, new PropertyChangedCallback(ImageChange))); public static readonly DependencyProperty ViewChangeProperty = DependencyProperty.Register("ViewChang", typeof(float), typeof(UserControl), new PropertyMetadata(null, new PropertyChangedCallback(ViewChang))); private static void ViewChang(DependencyObject d, DependencyPropertyChangedEventArgs e) { SetPhoto s = (SetPhoto)d; //第一个参数 最大倍数 //第二个参数 最小倍数 //第三个参数 放大倍数 s.scrollViewer.ChangeView(10, 0, (float)e.NewValue); } private static void ImageChange(DependencyObject d, DependencyPropertyChangedEventArgs e) { SetPhoto s = (SetPhoto)d; // 标准Image的Source的类型 方便 s.image.Source = (ImageSource)e.NewValue; } private static void OnChang(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { SetPhoto setphoto = (SetPhoto)d; switch ((bool)e.NewValue) { case true: setphoto.scrollViewer.ZoomMode = ZoomMode.Enabled; break; case false: setphoto.scrollViewer.ZoomMode = ZoomMode.Disabled; break; } } } /// <summary> /// 图片 /// </summary> public ImageSource ImageSource { get { return (ImageSource)GetValue(SetImageProperty); } set { SetValue(SetImageProperty, value); } } public bool IsOpenZoom { get { return (bool)GetValue(OpenZoomProperty); } set { SetValue(OpenZoomProperty, value); } } public float ViewChange { get { return (float)GetValue(ViewChangeProperty); } set { SetValue(ViewChangeProperty, value); } } } }
之后 这个SetPhoto用户控件就多了三个属性,以方便我们使用的。
值得一说,用户控件的使用方式,只有用户控件在个你要添加的xaml页面在再同一个命名空间中 你直接使用local关键字就可以了
<local:SetPhoto Grid.Row="1" x:Name="U" IsOpenZoom="True" />
c#直接添加就是
//实例化 SetPhoto setP=new SetPhoto();
之后添加到 你要添加的面板控件或者其他控件中 就可以了