我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c# wpf如何附加依赖项属性

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

c# wpf如何附加依赖项属性

  附加依赖项属性是一个属性本来不属于对象自己,但是某些特定场景其他的对象要使用该对象在这种场景下的值。这个值只在这个场景下使用。基于这个需求设计出来的属性。这里主要涉及到一个解耦问题。最大的优势是在特定场景下使用的属性,可以在特定场景下定义。这样业务上不会导致代码全部混在某个模块里。提升代码可维护性。

  我们举例一段代码。假设有个类Person。包含了身份ID(IdentityID),姓名(Name),出生年月(Birth date),性别(gender),民族(Nation)。 有一个School类,包含了年级(grade)。我们把用户所在的年纪通过依赖项属性的形式从Person类中解耦出去。这样就可以更好的设计业务的关联关系。

  我们创建继承自DependencyObject的School类。使用propa 快捷方式创建属性。我们给School添加了一个附加依赖项属性GradeProperty。

代码如下:


public class School : DependencyObject
 { 
  public static int GetGrade(DependencyObject obj)
  {
   return (int)obj.GetValue(GradeProperty);
  }

  public static void SetGrade(DependencyObject obj, int value)
  {
   obj.SetValue(GradeProperty, value);
  }

  // Using a DependencyProperty as the backing store for Grade. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty GradeProperty =
   DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(School), new PropertyMetadata(0));
 }

  我们继续创建Person类,使用propdp创建。因为我们已经学习了依赖项属性,所以我们只使用依赖项属性来创建所有Person下的属性对象。


public class Person : DependencyObject
 {
  public string IdentityID
  {
   get { return (string)GetValue(IdentityIDProperty); }
   set { SetValue(IdentityIDProperty, value); }
  }

  // Using a DependencyProperty as the backing store for IdentityID. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty IdentityIDProperty =
   DependencyProperty.Register("IdentityID", typeof(string), typeof(Person));

  public string Name
  {
   get { return (string)GetValue(NamePropertyProperty); }
   set { SetValue(NamePropertyProperty, value); }
  }

  // Using a DependencyProperty as the backing store for NameProperty. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty NamePropertyProperty =
   DependencyProperty.Register("Name", typeof(string), typeof(Person)); 

  public DateTime BirthDate
  {
   get { return (DateTime)GetValue(BirthDateProperty); }
   set { SetValue(BirthDateProperty, value); }
  }

  // Using a DependencyProperty as the backing store for BirthDate. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty BirthDateProperty =
   DependencyProperty.Register("BirthDate", typeof(DateTime), typeof(Person)); 

  public bool Gender
  {
   get { return (bool)GetValue(GenderProperty); }
   set { SetValue(GenderProperty, value); }
  }

  // Using a DependencyProperty as the backing store for Gender. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty GenderProperty =
   DependencyProperty.Register("Gender", typeof(bool), typeof(Person)); 

  public string Nation
  {
   get { return (string)GetValue(NationProperty); }
   set { SetValue(NationProperty, value); }
  }

  // Using a DependencyProperty as the backing store for Nation. This enables animation, styling, binding, etc...
  public static readonly DependencyProperty NationProperty =
   DependencyProperty.Register("Nation", typeof(string), typeof(Person));
   
 }

  我们创建一个按钮来给Person设置一个附加依赖项属性。学校的年级。

xaml代码和对应的cs代码:


 <Button Content="点击给Pserson对象在对应的业务上附加依赖性属性" Click="AddPsersonAttachedProperty_Click"/>

private void AddPsersonAttachedProperty_Click(object sender, RoutedEventArgs e)
  {
   Person person = new Person();
   School.SetGrade(person, 1);
   var grade = School.GetGrade(person);
   MessageBox.Show(grade.ToString()) ;
  }

我门通过点击按钮创建了一个Person对象。使用School.SetGrade(person,1)来调用了我门添加在School类下面的附加依赖项属性。我门给Person设置了附加依赖项属性,是School下的Grade依赖项属性值为1。关键点:附加依赖项属性的适用场景是给当前对象添加在某些场景下使用的属性值。  这个时候我们可以使用School.GetGrade(person)读取这个对象中的依赖项属性。依赖项属性理解到这里就行。Grid和子元素在Grid中放置行列的原理和这个对依赖项属性使用是一样的。只是有一些后续的逻辑。目前只要会使用能看懂就好。后续会在自定义控件中,设计自己的布局呈现控件时,在设计阶段讲解哪些应该使用依赖项属性,哪些使用附加依赖项属性。

用一个通过附加属性移动Slider控制小球在Canvas下的例子。 给一个不存在Left 和top属性的小球。添加一个在父容器canvas的附加依赖属性,用来控制小球在Canvas下的位置。附加依赖项属性,主要用于解耦。这篇文章就结束拉。


 <Canvas>
    <Slider x:Name="sliderX" Canvas.Top="10" Canvas.Left="10" Width="200" Minimum="50" Maximum="200"/>
    <Slider x:Name="sliderY" Canvas.Top="40" Canvas.Left="10" Width="200" Minimum="50" Maximum="200"/>
    <Ellipse Fill="Blue" Width="30" Height="30" Canvas.Left="{Binding ElementName=sliderX,Path=Value}" Canvas.Top="{Binding ElementName=sliderY,Path=Value}"/>
   </Canvas>

我们使用Canvas作为画板,在里面放入2个Slider一个控制水平位置,一个控制垂直位置。我们通过绑定Slider的Value到Ellipse在Canvas下的附加依赖项属性Canvas.Left和Canvas.Top来

控制小球的垂直和水平位置。来演示如何解耦Ellipse和canvas的布局关系。通过前面了解的的binding、依赖项属性和附加依赖项属性,发现写代码的思路是不是一下就改变了很多?耦合正在慢慢的从设计层就变低了。

以上就是c# wpf如何附加依赖项属性的详细内容,更多关于c# wpf附加依赖项属性的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c# wpf如何附加依赖项属性

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C# wpf利用附加属性实现界面上定义装饰器

装饰器是wpf中可以浮在控件上面的一种组件,我们通常可以用来实现一些诸如控件拖动点、提示框、自定义鼠标等界面功能。本文主要是利用附加属性实现界面上定义装饰器,需要的可以参考下
2022-12-16

C#中wpf怎么利用附加属性实现界面上定义装饰器

这篇文章主要介绍了C#中wpf怎么利用附加属性实现界面上定义装饰器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中wpf怎么利用附加属性实现界面上定义装饰器文章都会有所收获,下面我们一起来看看吧。前言装饰器
2023-07-04

如何使用replace属性来避免Composer的依赖冲突

这篇文章将为大家详细讲解有关如何使用replace属性来避免Composer的依赖冲突,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Composer 文档提供了两个基本的示例。 我将尝试解释一下:列出被该
2023-06-09

C++ 单元测试中如何模拟外部依赖项?

在 c++++ 中模拟外部依赖项有三种方法:1. 桩(预定义行为),2. 存根(记录调用),3. 注入(作为参数传递模拟)。通过桩、存根和注入,可以隔离组件并创建健壮的单元测试。C++ 单元测试中如何模拟外部依赖项在单元测试中,模拟外部依
C++ 单元测试中如何模拟外部依赖项?
2024-04-24

如何使用go工作区在本地加载依赖项?

php小编百草为你介绍如何使用go工作区在本地加载依赖项。在开发Go语言项目时,我们经常会使用到各种第三方库和依赖项。为了方便管理和加载这些依赖项,Go语言提供了一个强大的工作区(workspace)机制。通过设置工作区路径和使用go mo
如何使用go工作区在本地加载依赖项?
2024-02-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录