• WPF-依赖属性和附加属性《十》


    非常重要

    依赖属性和附加属性,两者是有关系的,也是有些区别的,很多时候,可能会把两者混淆了。

    依赖属性(Dependency property)

            就是一种自己没有值,并能通过使用Binding从数据源获取值,也就是依赖别人身上的属性,拥有依赖属性的对象,称为依赖对象。

    1.首先看一下依赖属性怎么建立的,输入propdp,点击tab按钮2次,就会自动出现

     2.建立一个默认的依赖属性

    补充:如果建立一个类报错的话

     继承依赖对象就没有报错了,上面继承的Windows其实也是继承了依赖对象,所以不会报错

     其实点击任意一个控件,看里面的属性,都含有依赖属性

    3. 使用依赖属性给Button增加鼠标划过显示颜色,建立一个类,继承Button 

    4.使用快捷键propdp建立完成,代码如下

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Windows;
    7. using System.Windows.Controls;
    8. namespace WpfApp2
    9. {
    10. public class ButtonEx : Button
    11. {
    12. static ButtonEx()
    13. {
    14. DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonEx), new FrameworkPropertyMetadata(typeof(ButtonEx)));//使ButtonEx去读取ButtonEx类型的样式,而不是去读取Button的样式
    15. }
    16. public int MyButtonEx
    17. {
    18. get { return (int)GetValue(ButtonExProperty); }
    19. set { SetValue(ButtonExProperty, value); }
    20. }
    21. // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
    22. public static readonly DependencyProperty ButtonExProperty =
    23. DependencyProperty.Register("MyButtonEx", typeof(int), typeof(ButtonEx), new PropertyMetadata(0));
    24. //依赖属性名称,依赖属性数据类型,所属哪个类中,属性的元数据
    25. }
    26. }

    5.建立ButtonEx的样式,建立资源字典Dictionary1.xaml

    6.增加样式

    1. "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    2. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    3. xmlns:local="clr-namespace:WpfApp2"
    4. >

    7.前台界面 

     

    可见,经过依赖属性之后,ButtonEx按钮就带了MouseOverBackColor属性,可以对其进行设置颜色。  依赖修改的比附加更多。依赖是整体都修改了,而附加是用哪个再附加哪个。

    附加属性(DependencyProperty)

            顾名思义,就是附加上面的属性,自身是没有的,别人附加上面的,就变成了自己的属性,就可以使用点. 点击 出来。比如说,wpf中PasswordBox控件是不能进行绑定数据的,但是你把它绑定一个密码,那么就是附加属性了。附加属性,也属于一种依赖属性。

    1.附加属性建立,输入propa,点击tab按钮2次

    2.修改对应的参数

    1. public static string GetPassword(DependencyObject obj)
    2. {
    3. return (string)obj.GetValue(MyPassword);
    4. }
    5. public static void SetPassword(DependencyObject obj, string value)
    6. {
    7. obj.SetValue(MyPassword, value);
    8. }
    9. // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
    10. public static readonly DependencyProperty MyPassword =
    11. DependencyProperty.RegisterAttached("Password", typeof(string), typeof(MainWindow), new PropertyMetadata(null));

    3.前端进行调用

    1. "WpfApp2.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WpfApp2"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. "{Binding PW}" HorizontalAlignment="Left" Margin="416,183,0,0" VerticalAlignment="Top" Width="120"/>

    4.写调用方法

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Windows;
    7. using System.Windows.Controls;
    8. using System.Windows.Data;
    9. using System.Windows.Documents;
    10. using System.Windows.Input;
    11. using System.Windows.Media;
    12. using System.Windows.Media.Imaging;
    13. using System.Windows.Navigation;
    14. using System.Windows.Shapes;
    15. namespace WpfApp2
    16. {
    17. ///
    18. /// Interaction logic for MainWindow.xaml
    19. ///
    20. public partial class MainWindow : Window
    21. {
    22. public MainWindow()
    23. {
    24. InitializeComponent();
    25. PW = "123456";
    26. this.DataContext = this;
    27. }
    28. public static string GetPassword(DependencyObject obj)
    29. {
    30. return (string)obj.GetValue(MyPassword);
    31. }
    32. public static void SetPassword(DependencyObject obj, string value)
    33. {
    34. obj.SetValue(MyPassword, value);
    35. }
    36. // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
    37. public static readonly DependencyProperty MyPassword =
    38. DependencyProperty.RegisterAttached("Password", typeof(string), typeof(MainWindow), new PropertyMetadata((s,e)=>
    39. {
    40. var pw = s as PasswordBox;
    41. pw.Password = e.NewValue.ToString();
    42. })); //这里和xaml中建立关系
    43. public string PW { get; set; }
    44. }
    45. }

  • 相关阅读:
    训练人工智能机器人的软实力
    java程序终端排查
    单片机ADC常见的几种滤波方法
    C++中的菱形继承问题及解决方案
    Mysql的存储引擎
    pat_basic_1017 A除以B
    大数据计算里的加速利器-向量化
    贪心算法——硬币找零2——python
    【使用篇】WebView 实现嵌套滑动,丝滑般实现吸顶效果,完美兼容 X5 webview
    一篇文章让你熟悉unordered_set及其模拟实现
  • 原文地址:https://blog.csdn.net/u012563853/article/details/126355178