原文:2018-8-10-win10-uwp-依赖属性

title author date CreateTime categories
win10 uwp 依赖属性
lindexi
2018-08-10 19:17:19 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文告诉大家如何使用依赖属性,包括在 UWP 和 WPF 如何使用。
本文不会告诉大家依赖属性的好处,只是简单告诉大家如何使用。

在 UWP 和 wpf ,如果需要创建自己的依赖属性,可以使用代码片,在 VisualStudio 可以使用 propdp 输入两个 tab 就可以输入依赖属性。

本文最后提供修改的代码片,可以解决变量名修改出现的界面绑定不刷新。

UWP

什么时候可以获取继承的依赖属性

依赖属性一般是不在构造函数写获取继承的属性的值,因为一般这时拿到的值都是没有继承,请看下面的代码

创建一个用户控件 LuenqxuhkRrjbzcf ,在他的构造函数和加载完成事件添加获得 DataContext 的值

  构造: var t = DataContext;

          private void LuenqxuhkRrjbzcf_Loaded(object sender, RoutedEventArgs e)
{
var t = DataContext;
}

然后把他加入到其他页面,这个页面设置了 DataContext ,但是运行在构造的断点可以看到拿到的值是空

但是可以在加载完成函数拿到

那么是在什么时候才可以拿到依赖属性的值?

依赖属性需要在加逻辑树才可以拿到值,所以在加入逻辑树之后,构造函数是类创建,所以这时不能拿依赖属性的值。

自定义可继承依赖属性

我找了很久,发现 uwp 不支持 FrameworkPropertyMetadata 所以无法自己定义可以继承的依赖属性

WPF

后台绑定 依赖属性

后台绑定 依赖属性可以使用 Binding

            Binding bind = new Binding("绑定路径,就是哪个属性")
{
Source = 绑定源,如果没有设置,可以使用 DataContext,
Mode = BindingMode.OneWayToSource
};
一个继承依赖的类.SetBinding(xx.xProperty, bind);

例如绑定 ViewModel 的 Padding 到 一个 G控件的 Padding, 可以使用下面代码

                Binding bind = new Binding("Padding")
{
Source = ViewModel,
Mode = BindingMode.OneWayToSource
};
G.SetBinding(Border.PaddingProperty, bind);

但我的问题是,绑定只能在包含 G 的类使用?

也就是在 MainPage 写了 G 这个 类,于是绑定只能写在 MainPage 类?

实际我用了一个类来测试

我把上面的绑定代码写到 ViewModel ,发现还是可以使用。

那么问题2,如果我的 ViewModel 的绑定属性是私有的,那么把绑定写在ViewModel 里,那么是否可以访问,可以看到,如果写在ViewModel 的Binding ,那么这个 Binding 是可以访问 ViewModel 的属性,虽然这个属性是私有的。但是实际绑定需要获取的不是在创建的时候拿到,所以这时是获取不到ViewModel 里的属性。

我尝试下面的代码,把 Padding 设置为 private ,然后在 ViewModel 里绑定到他,结果发现无法从绑定获得。

       public partial class MainWindow : Window
{
public MainWindow()
{
ViewModel = new ViewModel();
InitializeComponent();
DataContext = ViewModel; ViewModel.Board = G; //Binding bind = new Binding("Padding")
//{
// Source = ViewModel,
// Mode = BindingMode.OneWayToSource
//};
//G.SetBinding(Border.PaddingProperty, bind);
ViewModel.Click();
} public ViewModel ViewModel { get; set; } private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
G.Padding = new Thickness(G.Padding.Left + 1, G.Padding.Top + 1, G.Padding.Right, G.Padding.Bottom);
Console.WriteLine(ViewModel.Pad());
}
} public class ViewModel
{
public Thickness Pad()
{
return Padding;
} private Thickness Padding { get; set; } public Border Board { get; set; } public void Click()
{
Binding bind = new Binding("Padding")
{
Source = this,
Mode = BindingMode.OneWayToSource
};
Board.SetBinding(Border.PaddingProperty, bind);
}
}

如果在绑定之前,设置 G 的 Padding 为一个值,那么在设置绑定之后,这个值就会被设置默认值。

如果在绑定之前,设置 G 的 Padding 为20 ,那么设置绑定之后, G 的 Padding = 0

如果需要保留这个值,可以使用临时变量。

绑定还有另一个问题,一个属性只能做一次绑定。

假如我有多个属性,把这多个属性绑定在 G 的 Padding ,那么只有最后的一个绑定可以使用,其他的绑定无法使用。

            public Thickness BoardPadding { get; set; }

       public void Click()
{
Binding bind = new Binding("Padding")
{
Source = this,
Mode = BindingMode.OneWayToSource
}; BindingOperations.SetBinding(Board, Border.PaddingProperty, bind); bind = new Binding("BoardPadding")
{
Source = this,
Mode = BindingMode.OneWayToSource
};
Board.SetBinding(Border.PaddingProperty, bind);
}

可以看到,这时 Padding 的值一直没有。

WPF 获得依赖属性值更新

如果需要获得 G 的 Padding 的值更改,WPF 获得依赖属性 值更改可以使用下面代码

                DependencyPropertyDescriptor.FromProperty(Border.PaddingProperty,typeof(Border)).AddValueChanged(Board,
(s, e) =>
{
Padding = Board.Padding;
BoardPadding = Board.Padding;
});

这个方法就是获得属性的值更改

但是这个方法会出现内存泄露,可以使用 RemoveValueChanged 清除,为了使用清除,需要写一个函数。

不需要担心清除一个不存在的委托,一般在使用 AddValueChanged 之前都使用 RemoveValueChanged 清除

参见:https://stackoverflow.com/questions/4764916/listen-to-changes-of-dependency-property

初始化出现默认值类型与属性类型不同

定义的依赖属性是需要默认值类型和定义的一样,在一般的代码,可以使用隐式转换,但是在定义不可以使用。

例如使用类型是 double 实际给的是 int ,就会在运行出现ArgumentException

        public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
"Foo", typeof(double), typeof(MainWindow), new PropertyMetadata(2)); public double Foo
{
get { return (double) GetValue(FooProperty); }
set { SetValue(FooProperty, value); }
}

虽然定义double a=2;是对的,但是在这里定义的 2默认是错误的,需要写2d才是对的

修改属性名称

默认的代码片生成代码的属性名称是字符串,但是字符串有个缺点,如果修改了变量名,那么界面绑定就无法找到。

建议把字符串换为C# 6.0 带来的新特性

       public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
nameof(Foo), typeof(double), typeof(MainWindow), new PropertyMetadata(2d)); public double Foo
{
get { return (double) GetValue(FooProperty); }
set { SetValue(FooProperty, value); }
}

通过修改代码片就可以做到,如何修改请看 resharper 自定义代码片

下面就是修改后的代码

public static readonly $dependencyProperty$ $propertyName$Property = $dependencyProperty$.Register(
nameof($propertyName$), typeof($propertyType$), typeof($containingType$), new PropertyMetadata(default($propertyType$))); public $propertyType$ $propertyName$
{
get { return ($propertyType$) GetValue($propertyName$Property); }
set { SetValue($propertyName$Property, value); }

可以直接粘贴进去Resharper的代码

或者导入我的设置,点击下载

如果想要使用的是 C# 7 的特性,可以修改代码片,或者点击下载导入

public static readonly $dependencyProperty$ $propertyName$Property = $dependencyProperty$.Register(
nameof($propertyName$), typeof($propertyType$), typeof($containingType$), new PropertyMetadata(default($propertyType$))); public $propertyType$ $propertyName$
{
get => ($propertyType$) GetValue($propertyName$Property);
set => SetValue($propertyName$Property, value);
}

2018-8-10-win10-uwp-依赖属性的更多相关文章

  1. win10 uwp 依赖属性

    本文告诉大家如何使用依赖属性,包括在 UWP 和 WPF 如何使用. 本文不会告诉大家依赖属性的好处,只是简单告诉大家如何使用 在 UWP 和 wpf ,如果需要创建自己的依赖属性,可以使用代码片,在 ...

  2. [UWP]依赖属性1:概述

    1. 概述 依赖属性(DependencyProperty)是UWP的核心概念,它是有DependencyObject提供的一种特殊的属性.由于UWP的几乎所有UI元素都是集成于DependencyO ...

  3. [UWP]依赖属性2:使用依赖属性

    5. 完整的自定义依赖属性 5.1 定义 /// <summary> /// 标识 Title 依赖属性. /// </summary> public static reado ...

  4. 背水一战 Windows 10 (67) - 控件(控件基类): DependencyObject - CoreDispatcher, 依赖属性的设置与获取, 依赖属性的变化回调

    [源码下载] 背水一战 Windows 10 (67) - 控件(控件基类): DependencyObject - CoreDispatcher, 依赖属性的设置与获取, 依赖属性的变化回调 作者: ...

  5. [UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF)

    1. 前言 之前介绍过依赖属性和附加属性的代码段,这两个代码段我用了很多年,一直都帮了我很多.不过这两个代码段我也多年没修改过,Resharper老是提示我生成的代码可以修改,它这么有诚意,这次就只好 ...

  6. 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性

    [源码下载] 背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) 自定义控件 ...

  7. 【转】【译】在 Windows 10 应用程序中注册任意依赖属性的改变

    原文地址:http://visuallylocated.com/post/2015/04/01/Registering-to-any-DependencyProperty-changing-in-Wi ...

  8. UWP &WP8.1 依赖属性和用户控件 依赖属性简单使用 uwp添加UserControl

    上面说 附加属性.这章节说依赖属性. 所谓依赖属性.白话讲就是添加一个公开的属性. 同样,依赖属性的用法和附加属性的用法差不多. 依赖属性是具有一个get,set的属性,以及反调函数. 首先是声明依赖 ...

  9. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  10. win10 uwp 商业游戏 1.1.5

    本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏 因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏 下面我来告诉大家如何在游戏中添加多个 ...

随机推荐

  1. Springcloud 微服务 高并发(实战1):第1版秒杀

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列之15 [博客园总入口 ] 前言 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版 ...

  2. [Spring cloud 一步步实现广告系统] 5. 投放系统配置+启动+实体类

    广告投放系统启动主类说明 /** * SponsorApplication for 广告赞助商/投递服务启动类 * 添加注解{@link EnableFeignClients}之后,当前微服务就可以调 ...

  3. .NETCore C# 中级篇2-6 Json与XML

    .NETCoreCSharp 中级篇2-6 本节内容为Json和XML操作 简介 Json和XML文本是计算机网络通信中常见的文本格式,其中Json其实就是JavaScript中的数组与对象,体现了一 ...

  4. Bootstrap 基于Bootstrap和JQuery实现动态打开和关闭tab页

    基于Bootstrap和JQuery实现动态打开和关闭tab页   by:授客 QQ:1033553122 1.   测试环境 JQuery-3.2.1.min.j Bootstrap-3.3.7-d ...

  5. 推荐四个phpstorm酷炫实用插件 让你写代码的时候不在孤单!

    程序员写代码很孤独,每天只能和电脑屏幕交流,想要一个程序员鼓励师妹子,老板又不给配,如何让自己写代码的时候不再孤单呢?今天给大家分享的这四个插件,既实用又好玩,还能提高开发效率,这四个插件主要用到ph ...

  6. iOS-基于TCP连接<Scoket-客户端>

    一:前言(本文为TCP客户端) TCP首先要服务器开放一个端口 然后客户端去连接服务端的IP地址和端口号 连接成功之后再进行数据传输 要经历三次握手 二:代码在GitHub 1.需要的工具类 自行下载 ...

  7. Linux相关集合

    本篇概述 Linux xshell6 连接 Hadoop 启动关闭 Linux xshell6 连接相关问题 首先,虚拟机 得先能通成网(具体教程可百度) 然后,进行 本机 ip 的查询(xshell ...

  8. 流程控制语句if基本概述

    目录 1. 流程控制语句if基本概述 2. 流程控制语句if文件比较 判断文件是否存在,返回方式 使用变量的方法进行判断 请输入你要备份的数据库名称: wordpress 请输入你要备份的数据库密码: ...

  9. 模块二之序列化模块以及collections模块

    模块二之序列化模块以及collections模块 一.序列化模块 json模块 ''' 序列化:将python或其他语言的数据类型转换成字符串类型 json模块: 是一个序列化模块. json: 是一 ...

  10. Transportable tablespace on standby (Doc ID 788176.1)

    APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 10.2.0.4 [Release 10.2]Oracle ...