首页 > 其他分享 >WPF学习笔记一 依赖属性及其数据绑定

WPF学习笔记一 依赖属性及其数据绑定

时间:2023-06-07 11:34:01浏览次数:50  
标签:依赖 string 绑定 MyButton 笔记 WPF public 属性

本文想通过由浅入深的讲解让读者比较深的理解依赖属性.  首先,我们回顾一下依赖属性的发展历史.

  最初,人们提出面向对象编程时,并没有属性这个说法,当时叫做成员变量.一个对象由成员变量和成员函数组成,如下:

Public Class A{
   Public int Index;//成员变量
    Public void Fun(){} //成员函数
}

后来,提出了对成员变量的改进,增加了get/set 方法,成员变量自然也叫属性了。.net采用了这种方法:

Public Class A{
      Private int index;//属性
   Public  int Index{
        Set{index = Value;}
        Get{return index ;}
     }
   Public void Fun(){} //方法
}

到了WPF, 终于变成依赖属性(WPF大部分属性都是依赖属性)。我们先看一个依赖属性的实现,再理解。

public partial class MyButton : Button {
       public static DependencyProperty PressedImageProperty;//依赖属性
 
       public string PressedImage {
           get { return (string)GetValue(PressedImageProperty); }
           set { SetValue(PressedImageProperty, value); }
       }
 
       static MyButton() {
           PressedImageProperty = DependencyProperty.Register(
               "PressedImage", typeof(string), typeof(MyButton),
               new FrameworkPropertyMetadata(""));
       }
 
       public MyButton () {
           InitializeComponent();
       }

上面实现了一个PressedImage的依赖属性。和.net属性比较有几点区别:

 1。依赖属性的实体是静态的,类型为DependencyProperty。

   如上例中的属性PressedImage,如果在.net中会这样定义它的实体

    public string pressedImage;

    依赖属性却是这样:

     public static DependencyProperty PressedImageProperty;

  2。多了一个Register。

  3. 它的Get/Set方法借助DependencyObject的GetValue/SetValue来实现.

但凭这些区别是没法理解依赖属性,因为你不知道DependencyProperty,DependencyObject怎么实现的.这里我只能说一下依赖属性一个特点:

   在面向对象编程时,一个对象有自己的各种属性,我们以往创建一个对象时,它的属性值就保存在对象本身.但依赖属性却不是把属性值保存在对象本身,而是保存在一张公共的依赖属性表里,它包含所有对象的依赖属性.因此,当我们要知道一个对象的某个属性时,WPF不是从该对象直接取出,而是从那张公共的依赖属性表里取出.

 呵呵,大概你明白了为什么依赖属性会变得复杂起来.实际上,功能也强大得多.

 下面就来讨论自定义依赖属性和它的数据绑定.

通过例子说明。对上文MyButton进行修进,实现以下功能:当MyButton被按下时显示图片"c:\images\ButtonPressed.png",否则显示图片"c:\images\ButtonNormal.png".   xaml代码

<Button.Template>
    <ControlTemplate TargetType="{x:Type Button}">
        <Grid>
            <Image x:Name="imgNormal"
                   Source="c:\images\ButtonNormal.png" Visibility="Visible"/>
            <Image x:Name="imgPressed"
                   Source="c:\images\ButtonPressed.png" Visibility="Hidden" />
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsPressed" Value="True">
                <Setter TargetName="imgNormal" Property="Visibility" Value="Hidden"/>
                <Setter TargetName="imgPressed" Property="Visibility" Value="Visible"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Button.Template>

  cs文件代码:

public partial class MyButton : Button {
      
       public MyButton () {
           InitializeComponent();
       }

上面的代码看不懂也没关系,并没有用到依赖属性。 但同时,这个MyButton并没有使用价值,因为他的图片是固定的。我们希望MyButton的图片可以由用户来设定。在上面的xaml文件中,只需改变Image的Source属性。WPF的方法就是数据绑定,也就是把Image的Source属性绑定到一个变量,修改一下xaml:

<Button.Template>
    <ControlTemplate TargetType="{x:Type Button}">
        <Grid>      
            <Image x:Name="imgNormal" Source="{Binding Path=NormalImage}" Visibility="Visible"/>
            <Image x:Name="imgPressed" Source="{Binding Path=PressedImage}" Visibility="Hidden" />
        </Grid>    
        <ControlTemplate.Triggers>      
            <Trigger Property="IsPressed" Value="True">
                <Setter TargetName="imgNormal" Property="Visibility" Value="Hidden"/>
                <Setter TargetName="imgPressed" Property="Visibility" Value="Visible"/>
              </Trigger>    
        </ControlTemplate.Triggers>  
    </ControlTemplate>
</Button.Template>

imgNormal的图片路径绑定变量NormalImage, imgPressed的图片路径绑定到PressedImage,再在MyButton类中增加2个属性NormalImage,PressedImage

public partial class MyButton : Button {
           public   string NormalImage;
public   string NormalImage;
public MyButton () {
            InitializeComponent();
       }

 在使用MyButton时用以下语句访问:

<my:MyButton NormalImage="c:\images\ButtonNormal.png" 
 PressedImage="c:\images\ButtonPressed.png" />

   搞定!!怎么?编译通不过?因为NormalImage和PressedImage不是依赖属性,所以编译无法通过。 那就继续改吧,把NormalImage和PressedImage改成依赖属性。

MyButton.cs的最后代码如下: 

public partial class MyButton : Button {
       public static DependencyProperty NormalImageProperty;
       public static DependencyProperty PressedImageProperty;
 
       public string NormalImage {
           get { return (string)GetValue(NormalImageProperty); }
           set { SetValue(NormalImageProperty, value); }
       }
 
       public string PressedImage {
           get { return (string)GetValue(PressedImageProperty); }
           set { SetValue(PressedImageProperty, value); }
       }
 
       static MyButton () {
           NormalImageProperty = DependencyProperty.Register(
               "NormalImage", typeof(string), typeof(MyButton ),
               new FrameworkPropertyMetadata(""));
 
           PressedImageProperty = DependencyProperty.Register(
               "PressedImage", typeof(string), typeof(MyButton ),
               new FrameworkPropertyMetadata(""));
       }
 
       public MyButton () {
           InitializeComponent();
       }

为什么xaml不支持普通属性?

回顾一下WPF的基本理念:真正做到了分离界面设计人员与开发人员的工作。也就是说,xaml文件呈现的是用户界面,从xaml到用户界面的转化不是由编译器直接编译成用户界面的运行代码(这样和原来的WIN FORM又没有区别了),而是由WPF本身类库来来完成的,打个比方,XAML有如下代码:

<Button Background="White"></Button>

 其中的“White”是如何与C#中的System.Windows.Media.Brushes.White等价的呢?。原来WPF提供了Brush数据类型的转换器。

对于简单属性(如int类型的), WPF要解释它并不难,如果是自定义类型的呢,WPF要解释它也不难,比如要求开发人员在使用自定义类型的属性时,同时提供该自定义类型的转换器。因此,个人认为,xaml不支持普通属性的原因就是WPF的设计者认为没有必要。

 

 

 




标签:依赖,string,绑定,MyButton,笔记,WPF,public,属性
From: https://blog.51cto.com/u_4018548/6430518

相关文章

  • 006 数据库学习笔记--字符串操作函数 + 索引
    常用字符串操作函数:--返回字符串中指定的子串出现的开始位置(索引从1开始)selectCHARINDEX('34','1234567890123')asstartIndex--返回字符串中指定的子串出现的开始位置(索引从1开始,字串前必须加%)selectPATINDEX('%34%','1234567890123')asstartIndex--大小写转化s......
  • SRC赏金猎人—笔记二
    以下是如何将速率限制漏洞的影响从低增加到高甚至严重过程1、我访问了该网站,然后开始在网站的主文件中手动查找main.js2、我发现有一个Web服务托管在http://redacted.com/cloudservice.svc?singleWsdl3、我访问了该端点,发现所有功能都有很好的文档记录,对于每个端点,如果是......
  • vue3使用知识点笔记大全
    vue3使用知识点笔记大全 一、vue3项目搭建npm6.xnpminitvite@latestmyvue3--templatevuevue3.2.26 使用elementplusui框架npmi-Selementplus//全部引入importElementPlusfrom'element-plus';import'element-plus/dist/index.css';constV......
  • 软考高级软件架构师学习笔记一(软件架构设计)
    软件架构设计一、软件架构的概念⭐⭐⭐1、软件架构的概念需求分析-----------架构------------软件设计            (鸿沟)体系结构==架构架构设计就是需求分配,即是将满足需求的职责分配到组件上。2、软件架构建模结构模型:以架构的构件、连接件和其他概念来......
  • Java动态绑定机制
    Java的动态绑定机制当调用对象方法的时候,该方法会和该对象的内存地址\运行类型绑定当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用packagehspedu.poly_.dynamic_;publicclassDynamicBinding{publicstaticvoidmain(String[]args){Aa=newB(......
  • EasyUI——学习笔记
    资源文件介绍locale:easyui的css内置样式easyui核心样式:easyui.css图标演示:icon.cssthemes:汉化内置文字文件jquery.easyui.min.js:所有easyui封装好的jquery代码和ajax代码jquery.min.js:jquery文件 搭建环境的步骤1、导入需要的css样式文件:easyui.css、icon.css2......
  • 聊聊MAUI、WinUI3和WPF的优势及劣势
    今天在群里聊到WinUI3的学习及发展,还有他那堪比玩具的使用体验,正好梳理一篇关于WinUI3、MAUI和WPF优劣势,我整理的不是很好,所以又让ChatGPT在生成了一遍,感觉整体还可以。看完可以相互讨论一下;引言:在应用程序开发领域,选择合适的框架对于开发人员和业务来说至关重要。本文将比较并......
  • 构建之法读书笔记之二
    继续我的阅读之旅,上次说到我们编程时要规范化代码,这样方便他人也方便自己,其次就是要交流,来使我们的合作更加顺利。第五章又是团队,果然在软件工程这一领域扩展到信息技术乃至整个人类社会,最不能忽视的就是团队,这也是老生常谈了。本章讲了团队模式。团队模式有很多种如作者给我们......
  • 构建之法读书笔记之一
    和人月神话一样,构建之法也是老师所推荐的书目,当然这也是一本早有耳闻却现今才刚刚上手的一本。此书开始便告诉我们什么是软件工程,以及它与现代计算机技术之间的关系。什么是软件工程呢?软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。它包括下......
  • 构建之法读书笔记之三
    首先还是回顾一下之前的阅读,团队的合作模式、敏捷流程。对于合作,我们需要足够的交流,足够的耐心,同时也要积极发展个人能力,争做软件工程界面的优等生。这次我们要讲的是用户,每一个程序、项目,最终的审核者都是我们的目标受众——用户。因此我们最终的目的就是让用户满意。那怎么才能......