Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >WPF Binding学习(四) 绑定各种数据源

WPF Binding学习(四) 绑定各种数据源

作者头像
莫问今朝
发布于 2018-08-31 07:00:54
发布于 2018-08-31 07:00:54
4.3K00
代码可运行
举报
文章被收录于专栏:博客园博客园
运行总次数:0
代码可运行

转自:http://blog.csdn.net/lisenyang/article/details/18312199

1.集合作为数据源

   首先我们先创建一个模型类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public class Student
    {
        public int ID { get; set; }
        public String Name { get; set; }
    }

 然后我们创建我们的页面布局

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <StackPanel Width="300" Height="300" HorizontalAlignment="Left">
        <ListView Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="编号" DisplayMemberBinding="{Binding ID}" Width="100"></GridViewColumn>
                    <GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}" Width="100"></GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
       
    </StackPanel>

在这里我们使用了ListView控件和GridView控件来显示数据,这两个控件从表面来看应该属于同一级别的控件。实际上并非如此!ListView是ListBox的派生类,而GridView是ViewBase的派生类,ListView中的View是一个ViewBase对象,所以,GridView可以做为ListView的View来使用而不能当作独立的控件来使用。这里使用理念是组合模式,即ListView由一个View,但是至于是GridVIew还是其它类型的View,由程序员自己选择。其次,GridView的内容属性是Columns,这个属性是GridViewColumnCollection类型对象。因为XAML支持对内容属性的简写,可以省略<GridView.Columns>这层标签,直接在GridView内部定义<GridViewColumn>对象,GridViewColumn中最重要的一个属性是DisplayBinding(类型是BindingBase),使用这个属性可以指定这一列使用什么样的Binding去关联数据-----这与ListBox有些不同,ListBox使用的是DisplayMemberPath属性(类型是String)。如果想用更复杂的结构来表示这一标题或数据,则可为GridViewColumn设置Head Template和Cell Template,它们的类型都是DataTemplate

 接下来下后台代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 IList<Student> list = new ObservableCollection<Student>()
            {
                new Student(){ID=1,Name="狗娃"},
                  new Student(){ID=2,Name="狗剩"},
                    new Student(){ID=3,Name="铁蛋"}
            };
            this.listView1.ItemsSource = list;
          

只需在构造函数中创建对象并绑定到ListView上即可,然后运行就可以看到已经绑定完毕

    接下来看一下ObservableCollection这个集合,我们可以看到在这里使用的是ObservableCollection集合而并非平常的List集合,那么为什么呢,因为ObservableCollection集合实现了INotifyCollectionChanged接口,也就是可以双向绑定。

2.ADO.NET中DataTable对象做为数据源

    在wpf中,是允许将DataTable直接做为Binding的数据源的,下面以一个例子做为参考

   控件还可以用上面的控件,只需该数据源即可

  首先先创建一个用于创建DataTable的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   public DataTable CreateDt()
        {
            DataTable dt = new DataTable();
            DataColumn[] dc = new DataColumn[]
            {
                new DataColumn("ID"),
                 new DataColumn(){ColumnName="Name"}
            };
            dt.Columns.AddRange(dc);
            return dt;
        }

然后再构造函数中创建DataTable,赋予值并绑定即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  DataTable dt = CreateDt();
            DataRow dr = dt.NewRow();
            dr[0] = 1;
            dr[1] = "狗娃";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = 2;
            dr[1] = "狗剩";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = 1;
            dr[1] = "铁蛋";
            dt.Rows.Add(dr);
            //将数据源设置为Dt的视图
            this.listView1.ItemsSource = dt.DefaultView;

3.使用XML数据作为数据源

   WPF提供了两套处理XML的类库:

  1.符合DOM(Document Object Model 文档对象模式)标准类库:XmlDocument.XmlElement,XmlNode等类,这套类型特点中规中矩,功能强大,但也背负了太多的XML传统和复杂

  2.以LINQ(Language-Intergrated Query 语言集成查询)为基础的类库,包括:XDocument,XElement,XNode,XAttribute等类,这套类库特点是可以通过LINQ进行查询和操作,方便快捷

  首先使用第一种方案

    先创建一个XML文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8" ?>
<StudentList>
    <Student id="1">
        <Name>狗娃</Name>
    </Student>
    <Student id="2">
        <Name>狗剩</Name>
    </Student>
    <Student id="3">
        <Name>铁蛋</Name>
    </Student>
</StudentList>

 然后创建XAML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <StackPanel Width="300" Name="stackPanel1">
        <ListView Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="编号" DisplayMemberBinding="{Binding XPath=@id}">
                        
                    </GridViewColumn>
                    <GridViewColumn Header="姓名" DisplayMemberBinding="{Binding XPath=Name}">
                        
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </StackPanel>

注意:XML绑定不是使用Path,而是XPath

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\资料\f盘\代码\c#\WPF\TreeView\TestSource\Students.xml");
            //通过XmlDataProvider进行绑定数据
            XmlDataProvider dp = new XmlDataProvider();
            dp.Document = doc;
            dp.XPath = @"StudentList/Student";
            this.listView1.SetBinding(ListView.ItemsSourceProperty, new Binding() { Source=dp});

  绑定XMl使用到了XmlDataProvider,这个类是将XMl做为数据源源的一种快捷方式.XmlDataPrivider有个Source属性,可以使用它直接指定XML文档地址(无论XML文档是存储在本地还是网络位置),所以也可以这么写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 XmlDataProvider dp = new XmlDataProvider();
            dp.Source = new Uri(@"C:\资料\f盘\代码\c#\WPF\TreeView\TestSource\Students.xml");
            dp.XPath = @"StudentList/Student";
            this.listView1.SetBinding(ListView.ItemsSourceProperty, new Binding() { Source=dp});

4.使用LINQ做为数据源

   从3.0版本,.NET Framework开始支持LINQ,使用LINQ,可以方便的操作集合对象,LINQ查询结果是一个IEnumerable<T>类型对象,而IEnumerable<T>又派生自IEnumerable,所以可以作为列表控件的Items Source使用。

   现在还还用刚开始创建的那个Student模型类和XAML代码,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Student
    {
        public int ID { get; set; }
        public String Name { get; set; }
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<StackPanel Height="300" Width="300" HorizontalAlignment="Left">
        <ListView Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="编号" DisplayMemberBinding="{Binding ID}" Width="100"></GridViewColumn>
                    <GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}" Width="100"></GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </StackPanel>

 我们只需更改数据源即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 List<Student> stus = new List<Student>()
            {
                new Student(){ID=1,Name="狗娃"},
                 new Student(){ID=2,Name="铁蛋"},
                 new Student(){ID=3,Name="狗剩"}
            };
            this.listView1.ItemsSource = from stu in stus where stu.Name.StartsWith("狗") select stu;

还可以将数据放在DataTable中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 DataTable dt = CreateDt();
            DataRow dr = dt.NewRow();
            dr[0] = 1;
            dr[1] = "狗娃";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = 2;
            dr[1] = "狗剩";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = 1;
            dr[1] = "铁蛋";
            dt.Rows.Add(dr);

            this.listView1.ItemsSource = from row in dt.Rows.Cast<DataRow>()
                                         where (row["Name"] as String).StartsWith("狗")
                                         select new Student
                                         {
                                             ID = Convert.ToInt32(row["ID"]),
                                             Name = row["Name"] as String
                                         };

又或者使用XML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 XDocument xd = XDocument.Load(@"C:\资料\f盘\代码\c#\WPF\TreeView\TestSource\Students.xml");
            this.listView1.ItemsSource = from ele in xd.Descendants("Student")
                                         where (ele.Elements().First()).Value.StartsWith("狗")
                                         select new Student
                                         {
                                             ID = Convert.ToInt32(ele.Attribute("id").Value),
                                             Name = ele.Elements().First().Value

 5.ObjectDataProvider做为数据源

     理想情况下,上游程序员将类设计好,使用属性把数据暴露出来,下游程序员将这些类作为Binding的Source,把属性做为Binding的Path来消费。但很难保证一个类的属性都暴露出来,例如需要的数据可能是方法的返回值。而重新设计底层类的风险会比较高,况且有可能引用的类库情况我们不可能更改已经便宜好的类,这时候就需要使用ObjectDataProvider来包装做为Binding源的数据对象。

     ObjectDataProvider顾名思义就是把对对象做为数据源提供给Binding。上面使用的XmlDataProvider,这两个类的父类都是DataSourceProvider抽象类。

     现在做一个这样例子。

    有一个Calculator类,它具有一个加法方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Caculate
    {
        public string Add(string arg1, string arg2)
        {
            double x = 0;
            double y = 0;
            double z = 0;
            if (double.TryParse(arg1, out x) && double.TryParse(arg2, out y))
            {
                z = x + y;
                return z.ToString();
            }
            return "Iput Error";
        }

    }

  然后在XAML中创建三个TextBox框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<StackPanel Height="300" Width="300" HorizontalAlignment="Left">
        <TextBox Name="txtBox1" Width="120" HorizontalAlignment="Left"></TextBox>
        <TextBox Name="txtBox2" Width="120" Margin="0 10" HorizontalAlignment="Left"></TextBox>
        <TextBox Name="txtBox3" Width="120" Margin="0 10"  HorizontalAlignment="Left"></TextBox>
    </StackPanel>

 要实现的需求就是通过Caculate方法实现第三个文本框是前两个之和,也就是我们需要将前两个文本框绑定到Add方法的两个参数,第三个绑定到返回值上。

 然后我们在构造函数中编写后台代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  ObjectDataProvider odp = new ObjectDataProvider();
            //设置用于绑定源的对象
            odp.ObjectInstance = new Caculate();
            //设置调用方法的名称
            odp.MethodName = "Add";
            //添加方法参数
            odp.MethodParameters.Add("0");
            odp.MethodParameters.Add("0");
            //绑定参数到txtBox1和txtBox2
            this.txtBox1.SetBinding(TextBox.TextProperty, new Binding("MethodParameters[0]") { Source = odp, BindsDirectlyToSource = true, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
            this.txtBox2.SetBinding(TextBox.TextProperty, new Binding("MethodParameters[1]") { Source = odp, BindsDirectlyToSource = true, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
            //绑定结果
            this.txtBox3.SetBinding(TextBox.TextProperty, new Binding(".") { Source = odp});

   先来分析一下上面代码。ObjectDataProvider类的作用是包装一个以方法暴露数据的对象,这里就先创建一个ObjectDataProvider的对象.然后用一个Caculate对象做为ObjectInstance对象复制。这就是把Caculate对象包装在了ObjectDataProvider里面。接着使用MethodName属性指定调用的Caculate对象中Add的方法。问题来了,如果Caculator有多个构造器参数的方法Add应该如何区分?我们知道,重载方法的区别在于参数列表,紧接着两句就是向MethodParameter属性里面加入两个string类型的参数,这就相当于告诉ObjectDataProvider对象去调用Caculator对象中具有两个string类型参数的Add方法,换句话说,MethodParameter对于参数的感应是非常敏感的。

      准备好数据源之后,我们准备创建Binding。前面我们已经讲过使用索引器作为Binding的Path,第一个Binding它的Source是一个ObjectDataProvider对象,Path是ObjectDataProvider中MethodParameters所引用的第一个元素。BindsDirectlyToSource这句话是告诉Binding只是将UI上的值传递给源而不是被ObjectDataProvider包装的Caculator,同时UpdateSourceTrigger设置为UI只要一有变化就更新Source。第二个Binding只是对第一个的翻版,只是把Path属性指向了第二个元素。第三个binding仍然使用ObjectDataProvider作为Source,但使用“.”作为Path----前面讲过,当数据源本身就是数据的时候就用“.”来做为Path,在XAML中"."可以不写。

注意:  在ObjectDataProvider对象作为Binding的Source的时候,这个对象本身就代表了数据,所以这里的Path使用的“.”,而不是Data属性。

 6.使用RelativeSource当绑定源

 当一个Binding有明确的来源的时候,我们可以通过Source或者ElementName赋值的办法让Binding与之关联。有些时候我们不能确定作为Source对象叫什么名字,但是我们知道它与做为Binding目标对象在UI上的相对关系,比如控件自己关联自己的某个数据,关联自己某级容器的数据,这时候就需要用到Binding的RelativeSource属性。

RelativeSource属性的类型是RelativeSource类,通过这个类的几个静态或者非静态的属性我们可以控制它搜索相对数据源的方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <StackPanel x:Name="stackPanel1" Margin="10">
        <StackPanel x:Name="stackPanel2" Margin="10">
            <Grid Name="grid2"> 
                <TextBox Name="txtBox1" Width="100" Height="23" HorizontalAlignment="Left"></TextBox>
            </Grid>
        </StackPanel>
    </StackPanel>

  我们看下上面结构   这个XAML结构为   StackPanel1----StackPanel2---Grid2---TextBox  。然后以相对路径来为TextBox进行绑定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RelativeSource relative = new RelativeSource(RelativeSourceMode.FindAncestor);
            //设置要查找的上级级别
            relative.AncestorLevel = 1;
            //设置要查找的类型
            relative.AncestorType = typeof(StackPanel);
            Binding binding = new Binding("Name")
            {//设置相对绑定的数据源
                RelativeSource = relative
            };
            this.txtBox1.SetBinding(TextBox.TextProperty, binding);

  然后再观察以上代码。相对绑定源类为RelativeSource类,这个类构造可以放一个RelativeSourceMode枚举,这个枚举描述与绑定目标的位置相对的绑定源位置。枚举值有四个

  • PreviousData:当前显示向列表的上一个数据项
  • TemplateParent:引用应用了模板的元素,其中此模板中存在数据绑定元素。 
  • Self:引用正在绑定的元素,允许你该元素的一个属性绑定到同一元素的其他属性上。  
  • FindAncestor:引用数据绑定元素的父链中的上级。 可用于绑定到特定类型的上级或其子类

    在这里设置为了FindAncestor. 然后为RelativeSource设置查找的级别和查找的类型。这里是先筛选类型,再筛选级别,比如现在查找的是深度为1的StackPanel。所以选中的是StackPanel2 而不是Grid2 。最后将RelativeSource对象设置为Binding的数据源

注意:设置数据源使用的是RelativeSource而不是Source

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《深入浅出WPF》学习笔记之深入浅出话Binding
  如果把Binding比作数据的桥梁,那么它的两端分别是Binding的源(Source)和目标(Target)。一般源是逻辑层对象,目标是UI层控件对象.
zls365
2021/02/26
5.7K0
【愚公系列】2023年10月 WPF控件专题 ListView控件详解
WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。
愚公搬代码
2023/10/11
6720
【愚公系列】2023年11月 WPF控件专题 GridView控件详解
WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。
愚公搬代码
2023/11/03
6930
WPF Binding学习(二)
  Binding作为数据的桥梁,连通业务逻辑层的对象(源对象)和UI的控件对象(目标对象)。在这座桥梁上,我们不仅可以控制在源对象与目标对象是双向通行还是单向通行。还可以控制数据的放行时机,甚至可以在这座桥上搭建一些关卡用来转换数据类型或者检验数据的正确性
莫问今朝
2018/08/31
7910
WPF备忘录(4)打个勾画个叉娱乐下
<Path Grid.Column="2" Data="M43,5 L20,40 20,40 0,20 6,15 18,26 37,7 43,5 z" Fill="Green" Margin="5" Stretch="Fill" HorizontalAlignment="Right"/> image.png <Path Margin="5" Data="M50,25 L25,50 M25,25 50,50" Fill="#FFF4F4F5" Stretch="Fill" Stroke="Red"
hbbliyong
2018/03/05
1K0
WPF备忘录(4)打个勾画个叉娱乐下
WPF 使用 HandyControl 给 ListView 添加漂亮的表头效果
本文将来安利大家一个很好用的 UI 控件库,著名的 HandyControl 库。在想要给 ListView 添加一个表头,同时想要这个 ListView 在没有美工小姐姐的帮助下也能看起来比较好看,此时就特别适合使用 HandyControl 库
林德熙
2020/07/28
3.8K0
WPF 使用 HandyControl 给 ListView 添加漂亮的表头效果
WPF 列表右键菜单比较符合 MVVM 的命令绑定方法
群里小伙伴问我如何在 ListView 的右击的时候知道右击的是哪一项,他想要获取对应的行信息。他使用的是 GridView 做的,于是我告诉他需要自己写 ItemContainerStyle 在 GridViewRowPresenter 里添加右键的逻辑。但是这样写不清真,我问到了他的本质问题其实只是想要做右键菜单。刚好我在写一个测试应用,用于测试我的文件下载库,此时需要用到在右击某一个下载项的时候,拿到当前下载项的信息,给出右键菜单。我不使用小伙伴的逻辑,就按照我自己会采用的写法,我认为这样写比较符合 WPF 框架的设计,下面让我告诉大家我的用法,十分简单
林德熙
2020/07/28
3.1K0
WPF Binding学习(三)
上面代码就可以实现控件之间的双向绑定,我们发现我们的绑定数据源不是Source,而是ElementName.
莫问今朝
2018/08/31
1.7K0
WPF Binding学习(三)
《深入浅出WPF》——模板学习
图形用户界面(GUI,Graphic User Interface)应用较之控制台界面(CUI,Command User Interface)应用程序最大的好处就是界面友好、数据显示直观。CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本、列表、图形等多种形式立体显示。 用户体验在GUI程序设计中起着举足轻重的作用——用户界面设计成什么样子看上去才够漂亮?控件如何安排才简单易用并且少犯错误?(控件并不是越复杂越好)这些都是设计师需要考虑的问题。WPF系统不但支持传统Windows Forms(简称WinForm)编程的用户界面和用户体验设计,更支持使用专门的设计工具Microsoft Expression Blend进行专业设计,同时还推出了以模板为核心的新一代设计理念(这是2010年左右的书,在那时是新理念,放现在较传统.NET开发也还行,不属于落后的技术)。 本章我们就一同来领略WPF强大的模板功能的风采。
全栈程序员站长
2022/09/09
5K0
《深入浅出WPF》——模板学习
WPF是什么_wpf documentviewer
项目中要用到一个数据分页栏,虽然自己没有实现过,但凭经验感觉它和ListBox/ListView有关。于是去网上搜了下WPF 数据分页栏,果然很多实现都用到了ListView。于是拣了一种比较简单的实现学习,其中包含下面代码:
全栈程序员站长
2022/09/28
4.7K0
WPF是什么_wpf documentviewer
WPF桌面端开发-数据绑定(Binding)
此模式允许将给定的 ControlTemplate 属性绑定到应用 ControlTemplate 的控件的属性。为了更好地理解这里的问题,下面是一个示例
码客说
2023/07/11
3170
WPF实现简单的数据绑定
首先创建一个作为数据源来使用,这里创建的类需要实现System.ComponentModel名称空间中的INotifyPropertyChanged接口。当为Binding设置了数据源之后,Binding就会自动侦听来自这个接口的PropertyChanged事件。
MaybeHC
2024/04/23
750
WPF实现简单的数据绑定
C#-ListView的使用
ListView顾名思义用来做列表数据展示,也是我们在开发中经常使用的控件之一,接下来将展示下它的一些使用场景,以满足不同的需求。
kdyonly
2023/03/03
9770
C#-ListView的使用
Silverlight Telerik控件学习:GridView双向绑定
做过WinForm数据库开发的人,一定有类似经历:DataGrid绑定后,如果允许行编辑,数据一顿修改后,想批量保存修改后的结果,通常是将DataGrid的所有行遍历,用FindControl找出其中的TextBox之类的控件,取值,然后处理,如果行模板中的控件变化了,可能之前的处理代码又要修改... .Net发展到WPF/SL时代,有了双向绑定,这种痛苦经历已经一去不返了,我们只需要关注数据即可,GridView与数据源之间会相互通知各自的变化情况,批量保存时,不管GridView中的数据用户如何修改,也
菩提树下的杨过
2018/01/23
9290
Silverlight Telerik控件学习:GridView双向绑定
WPF-数据绑定
这是数据绑定中的特殊情况,Binding源本身就数据且不需要Path来指明,string、int等基本数据。
MaybeHC
2024/04/23
830
WPF-数据绑定
Binding(一):数据绑定
这节开始分几期来讲一下WPF中Binding的相关用法,本节主要讲使用Binding进行数据绑定。
宿春磊Charles
2021/11/05
1.4K0
WPF:数据虚拟化
A collection class providing data virtualization with large data sets.
沙漠尽头的狼
2022/04/18
5470
WPF:数据虚拟化
【翻译】WPF中的数据绑定表达式
有很多文章讨论绑定的概念,并讲解如何使用StaticResources和DynamicResources绑定属性。这些概念使用WPF提供的数据绑定表达式。在本文中,让我们研究WPF提供的不同类型的数据绑定表达式。
沙漠尽头的狼
2021/12/01
2.5K0
【翻译】WPF中的数据绑定表达式
WPF DataGrid 直接绑定数据
初学WPF 以前用的Winform中的 DatagridView就是直接绑定Datasource 就ok了
zls365
2020/12/15
3.6K0
【愚公系列】2023年10月 WPF控件专题 DataGrid控件详解
WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。
愚公搬代码
2023/10/12
1.3K0
相关推荐
《深入浅出WPF》学习笔记之深入浅出话Binding
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验