WPF 基础知识学习简单总结(二)

资源

WPF资源系统保存公有对象和样式,重用这些对象和样式。

资源基础:元素都有Resources属性,存储资源字典集合。可以访问它自己和父元素。

资源层次:从自己的资源集合开始查找

静态资源和动态资源区别:StaticResource和DynamicResource

静态资源,一次性设置完毕;

动态资源,发生改变重新应用。

静态资源引用是从控件所在的容器开始依次向上查找的,而动态资源的引用是从控件开始向上查找的(即控件的资源覆盖其父容器的同名资源)

非共享资源:X:Share='false'

通过代码访问资源:this.Resources["资源键值"]和this.FindResource("资源键值");

查找:查找窗口资源,应用程序资源;当前激活状态下的Theme资源字典;系统资源。

资源字典:作用是在多个项目之间共享资源的话。是XAML文档,可以通过右键项目->添加资源字典。

  • 1 在资源字典中添加自定义style等
  • 2 在Application.Resources中添加资源字典文件引用
  • 3 通过资源的Key属性来进行引用

应用程序下共享资源:1 创建ResourceDictionary对象 2 使用ComponentResourceKey,必须动态资源。定义和引用从外部程序集加载的资源键。

WPF样式

 WPF样式使用:Window.Resources设置窗口资源。

创建资源集合:创建Style对象。包含了Setter集合

Style的属性:

  • Setters:属性值对象的集合
  • Triggers:自动改变样式
  • Resources:样式的资源集合
  • BasedOn:继承自其他样式
  • TargetType:元素的类型

Setter:Property指定作用到的属性,Value则指定作用到的属性值。TargetType 指定被作用的对象类型

创建样式对象:更精细目标的样式,使用容器的Resoures,应用程序中重用样式,可以使用应用程序的Resources。

设置属性:在某些情况下不能使用简单的特性字符(Property)设置属性值。可使用嵌套的元素代替

关联事件处理程序:为事件关联特定事件处理程序的EventSetter对象的集合。

关联事件处理程序使用:Event指定事件,Handler指定处理程序

多层样式:设置BasedOn特性继承样式

11.1.5 通过类型自动应用样式:设置TargetType属性忽略键名,实际是隐式的使用类型标记扩展设置键名,比如x:Key="{x:Type Button}"

11.2 触发器:属性发生变化时自动调整样式

  • Trigger:监测依赖属性的变化
  • MultiTrigger:联合多个条件
  • DataTrigger:监视绑定数据的变化
  • MultiDataTrigger:联合多个数据触发器
  • EventTrigger:事件发生时应用动画

使用:1 Style.Triggers 2 设置事件 Trigger Property 3  设置样式 Setter Property

使用多个:1 Style.Triggers 2  MultiDataTrigger  3  设置事件 MultiDataTrigger.Conditions Property

 4  设置样式MultiDataTrigger.Setters Property

事件触发器:普通触发器等待属性变化,事件触发器等待特定事件被引发。要求提供列修改控件的动作

使用: 1 设置事件 EventTrigger RoutedEvent 2 触发响应处理 EventTrigger.Actions,BeginStoryboard,Storyboard,类

 行为:封装通用用户界面功能

获取行为支持:

  • 安装Expression Blend
  • System.Windows.Interativity.dll。定义支持行为的基本类。
  • Microsoft.Expression.Inteactions.dll。通过添加可选的以核心行为类为基础的动作和触发器类

创建行为:

  •  创建继承自Behavior基类的类
  •  覆盖OnAttached()和OnDetaching()。
  • 可以访问放置行为的元素(通过AssociatedObject属性),
  • 调用OnAttached()方法关联事件处理程序。
  • 调用OnDetaching()方法移除事件处理程序。

 使用行为:

  • 添加对定义类的类库以及System.Windows.Interactivity.dll程序集的引用
  • 使用Interaction.Behaviors附加属性

 控件模板 

WPF中的逻辑树和可视化树

逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素。

可视化树,树中的每个节点代表可以在控件模板中定制的元素。

逻辑树指的是UI界面的组成元素的结构

可视化树是逻辑树的扩展版本,它将元素分成更小的部分。

System.Windows.LogicalTreeHelper提供了几个方法浏览逻辑树:

  • FindLogicalNode():依靠名字查找指定元素,开始于指定元素,沿逻辑树向下搜索。
  • BringIntoView():滚动容器(如果可能),使指定元素可见。
  • GetParent():获得指定元素的父元素。
  • GetChildren():获得指定元素的子元素。

VisualTreeHelper提供:GetChildrenCount(),GetChild(),和GetParent();

控件模板主要是用来改变控件的外观

数据模板则定义控件中数据的表现方式

控件模板:控件的外观通过ControlTemplate类型的对象确定,该对象指定了组成控件的显示的各种视觉元素。

有两部分:VistualTree视觉树,即是能看到的外观;Trigger触发器,里面包括外部条件达到某一条件下会引起的响应。

当WPF创建控件时,会创建控件类(模板父)的实例,然后实例化通过它的ControlTemplate设定的这个控件的外观树(组成这个控件的内部UI元素)。

开发自定义的简单控件模板

  • 在Window的Resources中定义一个名字为myButtonTemplate的控件模板,并指定key标记
  • 在使用StaticResource标记扩展为Button的Template属性赋值
  • TemplateBinding将控件模板中的属性绑定到控件本身(模板父)

ContentPresenter对象

  • ContentPresenter作为占位符,指定Content应该放置的位置;
  • 从模板父获取实际的内容,绑定到自己的Content属性;
  • 设置TargetType属性为模板父的类型。

五、触发器

  • Trigger必须在ControlTemplate.Triggers的节点下;
  • Triggers集合中可以包含任意数量的Trigger;
  • 一个Trigger可以有任意数量的Setter;
  • 每个Setter中指定三个属性,分别是TargetName、Property和Value。

实现:1 建立触发器ControlTemplate.Triggers 2 设置事件Trigger Property 3 改变属性Setter Property

组织模板资源:ResourceDictionary.MergedDictionaries的ResourceDictionary,Source

使用样式应用模板:设置Style的Setter Property为Control.Template,value为模板名,在容器上设置Style属性

自动应用模板:设置Style的TargetType为x:Type Button

动态更换皮肤:Application.Current.Resources.MergedDictionaries[0]重新赋值为ResourceDictionary实例

数据绑定

变更通知

1.将所有的源属性更改为依赖属性。

2.为每个属性引发一个事件(如:porpertyNameChanged的事件)。

3.可以实现System.ComponentModel.INotifyPropertyChanged接口,需要名称为PropertyChanged的事件

绑定到对象集合:绑定对象:使用Binding关键字并指定ElementName和Path,就是指定源对象(Source)和源属性(Source Property).

  • 常用标记:{Binding Path =””}
  • 利用ItemsSource来绑定数据源
  • 利用DataContext来作为共享数据源,DataContext就是数据上下文对象,它是为了避免多个对象共享一个数据源时重复的对所有对象显式地用binding标记每个Source/RelativeSource/ElementName。
  • 启用集合跟踪,数据源必须实现INotifyCollectionChanged的接口,WPF提供ObservableCollection

针对于ItemsControl的绑定

  • itemsSource 指定要显示的数据源
  • DisplayMemberPath 指定源对象中被显示的属性。
  • ItemTemplate 指定以什么样的格式来显示数据
  • Path 数据源对象中的属性—控制显示
  • DataContext 共享数据源

WPF之UI虚拟化:只渲染当前可视区域内的元素,当可视区域内的元素需要发生改变时,再渲染即将展现的元素

  • ListBox;IsVirtualizing = "True" // 开启虚拟化
  • <TreeView VirtualizingStackPanel.IsVirtualizing="True"/>

项容器再循环:如果启用项容器再循环,ListBox控件只保存少量的ListBoxItem对象存活,并当滚动时通知新数据加载这些ListBoxItem对象,从而重复使用它们。

  • <ListBox VirtualizingStackPanel.VirtualizationMode="Recycling"  VirtualizingStackPanel.IsVirtualizing="True" />

 缓存长度: VirtualizingStackPanel创建几个超过其显示范围的附加项,这样,在滚动的时候,可以立即显示这些项。

  •  <ListBox VirtualizingStackPanel.CacheLength="1"  VirtualizingStackPanel.CacheLengthUnit="Page" />

 滚动延迟:提升滚动性能,开启延迟滚动特性,VirtualizingStackPanel.ScrollUnit默认为基于项的滚动,也可基于像素滚动。

  • <ListBox ScrollViewer.IsDeferredScrollingEnabled="True" VirtualizingStackPanel.ScrollUnit="Pixel"/>

验证

  •  在数据对象上进行验证:普通属性验证或者实现IDataErrorInfo接口
  • 可以再绑定规则上进行验证:ExceptionValidationRule异常验证规则 DataErrorValidationRule数据错误验证规则

默认情况下,Binding.ValidatesOnException为false,WPF忽视绑定错误。

Binding.ValidatesOnException为true:

  1. 设置绑定元素的附加属性 Validation.HasError为true(如TextBox,如果Text被绑定,并出现错误)。
  2. 创建一个包含错误详细信息(如抛出的Exception对象)的ValidationError对象。
  3. 将上面产生的对象添加到绑定对象的Validation.Errors附加属性当中。
  4. 如果Binding.NotifyOnValidationError是true,那么绑定元素的附加属性中的Validation.Error附加事件将被触发。(这是一个冒泡事件)

PS:对于绑定的校验只在Binding.Mode 为TwoWay和OneWayToSource才有效

实现:

  • 在Setter中进行判断:不符合规则,那么就抛出异常。修改XAML不忽视异常。
  • 继承IDataErrorInfo接口:使Model对象继承IDataErrorInfo接口,并实现索引进行校验。索引返回不为空,表示有错误。
  • 自定义校验规则:通过继承ValidationRule抽象类,并实现Validate方法,并添加到绑定元素的Binding.ValidationRules中。
  • 使用数据注解(特性方式):在System.ComponentModel.DataAnnotaions命名空间中定义了很多特性,放置在属性前面,显示验证的具体需要。

自定义错误显示模板:出现错误时,WPF会把错误信息封装为一个ValidationError对象,并添加到Validation.Errors

为控件创建ErrorTemplate:创建AdornedElementPlaceholder控件的占位符,设置Validation.ErrorTemplate

数据提供者

  • ObjectDataProvider:调用另一个类方法获取信息
  • XmlDataProvider:从XML获取信息

ObjectDataProvider: 

  • 1.创建对象调用构造函数传入参数。 
  • 2.调用方法传入参数 
  • 3.异步创建数据对象 

格式化绑定数据

字符串格式化。用StringFormat属性

语法:StringFormat = "{}{0:格式字符串}" 其中第一个花括号{}是标识转义序列。以花括号开头时才需要

WPF列表控件也支持字符串格式化列表项目。设置列表的ItemStringFormat属性(定义在ItemsControl类)。

介绍值转换器

值转换器负责源数据和目标的转换。恰好在源数据被显示之前转换,以及在两路绑定的情况下,恰好在目标值被应用回源数据之前转换。

创造值转换器,需要4步:

  1. 创造实现IValueConverter接口的类
  2. 添加特性ValueConversion属性到类声明,指定目标数据类型。
  3. 实现Convert()方法,此方法改变数据,从原始格式到显示格式。
  4. 实现ConvertBack()方法,此方法反向改变值,从显示格式到本地格式。

应用到xml:

  • 使用<Binding.Converter>标签,嵌套<local:转化器对象>标签
  • 在Window.Resources创建<local:转化器对象>,直接赋值给Binding的Converter属性

用值转换器创建对象

值转换器是连接数据类和窗口显示的桥梁。

实现文件路径到BitmapImage对象

  • 创建转化类,在Convert方法获取路径返回BitmapImage。
  • 设置Image的Source属性,设置Binding的Converter转化器属性

值转换器不光能格式化数据,还可以根据数据规则格式化元素中的外观相关的一些工作。

应用条件格式:在Convert方法判断条件返回不同值。

 估值多个属性:将多个值合并为一个结果。

  • 使用MultiBinding,格式转化器StringFormat="{1}, {0}",嵌套<Binding path>标签
  • 使用MultiBinding,值转化器Converter,嵌套<Binding path>标签,来源值是object[]类型

列表控件继承图和常用属性:

列表控件的基类是ItemsControl。有Menu和TreeView类,MenuItem和TreeViewItem类,这是因为这些类能够包含自己的项集合---实现嵌套的层次化结构。没有ComboBoxItem或ListBoxItem类。

ItemsControl类的下一级是Selector类,它添加了一组属性描述被选择的项目。

Selector类添加的属性包括:SelectedItem,SelectedIndex,SelectedValue,SelectedValuePath。

注意,Selector类不支持多选。ListBox通过SelectionMode和SelectedItems属性支持多选。

  • DisplayMemberPath:每个数据项目显示的属性
  • ItemStringFormat:格式字符串
  • ItemContainerStyle:一个样式允许你设置包裹每个项目容器的属性
  • ItemTemplate:一个模板

ItemContainerStyle

如果ItemContainerStyle被设置,当项目被创造时,样式将向下传递到列表控件的每个项目。

使用:1 创建<ListBox.ItemContainerStyle> 2 设置 <Style><Setter>样式

带触发器的样式,样式中的触发器是在满足某个前提条件的情况下,设置控件的属性:

使用:1 创建<ListBox.ItemContainerStyle> 2 创建<Style.Triggers> 3 设置触发条件<Trigger Property 4设置样式<Setter>

带复选框或单选按钮的列表框

基本技术是修改代表每个列表项目容器的控件模板。不要修改ListBox.Template属性,因为它是列表框的模板。你需要修改ListBoxItem.Template属性。

交替项目样式

AlternationCount是形成一个序列的项目数,在此数目以后样式交替。默认情况下,AlternationCount被设置为0,并且不使用交替格式化。如果你设置AlternationCount为1,列表将在每个项目以后交替,这允许你应用偶奇格式化模式。

给每个ListBoxItem一个AlternationIndex属性,允许你决定它在交替项目的序列如何编号。假设你设置AlternationCount为2,第一ListBoxItem获得一个AlternationIndex的0,第二获得一个AlternationIndex的1,第三获得一个AlternationIndex的0,第四获得一个AlternationIndex的1,等等。

使用:设置触发器事件:设置Trigger Property属性为ItemsControl.AlternationIndex,值为1.

样式选择器

必须用代码方式实现,从StyleSelector派生一个专用的类,覆盖SelectStyle()方法,选择合适的样式。

使用:1 在Window.Resources定义样式 2 建造StyleSelector派生类 3 创建ItemContainerStyleSelector标签内嵌local

数据模板

每个ListBoxItem只能绑定一个字段,没有办法结合多个字段。如果要显示多个字段,这就需要用到数据模板。数据模板是一块XAML标记。它定义了应该如何显示一个绑定数据对象。二类型的控件支持数据模板:

  • 内容控件通过ContentTemplate属性支持数据模板。内容模板被用来显示Content属性。
  • 列表控件通过ItemTemplate属性支持数据模板。这模板被用来显示集合每个项目。集合通过ItemsSource提供。

列表项目是一个内容控件。数据模板应该包括数据绑定表达式。

使用:1 创建<ListBox.ItemTemplate> 2 内嵌<DataTemplate> 3 内嵌多个标签

分离和重用模板:通常声明为窗口或应用程序资源

使用更高级的模板:链接事件,存储额外的识别信息,定义绑定时,遗漏Path属性,抓取整个数据对象。

改变模板:

  • 使用数据触发器。可根据绑定的数据对象中的属性值使用触发器修改模型中的属性。
  • 使用值转换器。实现了IValueConverter接口的类,能够将值从绑定的对象转换为可用于设置模块中与格式化相关的属性的值。
  • 使用模板选择器。模板选择器检查绑定的数据对象,并在几个不同模板之间进行选择。

数据触发器:基于数据项目的一个属性,设置模板元素的一个属性。例如,基于相应产品对象的CategoryName属性,你能改变包裹每个列表项目的自定义边界的背景。

1 创建触发器,DataTemplate.Triggers标签  2 监听属性,创建DataTrigger标签,设置Binding的path,value 

3 改变样式,设置Setter的Property,Value

模板选择器:创造派生自DataTemplateSelector类。检查绑定对象并且使用你提供逻辑选择一个合适的模板。

使用:1 在Window.Resources定义模板DataTemplate   2 建造DataTemplateSelector派生类,实现SelectTemplate

 3 创建ItemTemplateSelector标签内嵌local,传入public参数

 模板与选择:Foreground属性使用属性继承,所以你添加到模板任何元素自动地获得白颜色。Background属性不使用属性继承,但是默认背景颜色是透明。

在数据模板中,使用Binding的RelativeSource属性搜索目前的ListBoxItem。

需要使用DataTrigger而不是一个普通的触发器,因为需要的属性在祖先元素中(ListBoxItem),并且唯一访问它的办法是使用数据绑定表达式。

改变项目布局

使用任何从System.Windows.Controls.Panel派生的类,设置ListBox的ItemsPanelTemplate属性,可以改变项目布局。

你必须也设置ScrollViewer.HorizontalScrollBarVisibility附加属性为Disabled。这确保ScrollViewer从不使用水平的scrollbar。

VirtualizingStackPanel对于大量数据项目有更好的性能。

实现:1 创建ListBox.ItemsPanel 2 使用ItemsPanelTemplate,WrapPanel

组合框

默认,ComboBox是只读的。当设置IsReadOnly属性为假并且IsEditable属性为真,选择框变成文本框,你能键入任何文本。

组合框有自动完成的功能。要关闭它,设置ComboBox.IsTextSearchEnabled属性为假。此属性位于ItemsControl类。

如果IsEditable属性是假(这是默认值),选择框将显示一个项目的精确视觉副本。

重要的细节是组合框显示的内容是什么,而不是它的数据源是什么。例如,用Product对象填充一个组合框控件,并且设置DisplayMemberPath属性为ModelName。如此,组合框显示每个项目的ModelName属性。即组合框从一组Product对象获取信息,你的标记创造的是一个普通的文本列表。它将显示当前产品的ModelName,并且如果IsEditable是真并且IsReadOnly是假,它将允许你编辑那值。

如果IsEditable属性是真,选择框显示一个它的一个逐字的表示法。就是简单地调用ToString()到项目。一般情况下,显示一个类名的全称。

纠正这个问题最简单的方法是,设置TextSearch.TextPath附着属性指明组合框应该使用的内容。

<ComboBox IsEditable="True" IsReadOnly="True" TextSearch.TextPath="ModelName" ...>

列表,树,网络

ListView

ListView从ListBox派生,增加View属性。

View属性指向ViewBase实例。有一样式应用于ListView控件(DefaultStyleKey属性),和另一样式应用于ListView项目(ItemContainerDefaultStyleKey属性)。返回指向样式的ResourceKey对象。

用GridView创造多列

GridView派生自ViewBase。代表带有多个列的一个列表视图。

添加GridViewColumn对象到GridView.Columns集合。

Header属性提供被放置在列顶的文本。

DisplayMemberBinding属性包含绑定,提取显示的信息。

改变列尺寸:GridViewColumn的Width属性

使用单元格模板:CellTemplate属性取一个数据模板。它只应用于一列。每列可以拥有它自己的数据模板。

使用:1 创建GridViewColumn.CellTemplate标签 2 创建数据模板DataTemplate 3自定义标签

树视图

树视图TreeView是特殊的ItemsControl,容纳TreeViewItem对象

TreeViewItem是独立的ItemsControl,能够持有更多TreeViewItem对象。

从技术上,TreeViewItem派生自HeaderedItemsControl,派生自ItemsControl。HeaderedItemsControl类添加一个Header属性,这持有你希望显示的树项目内容(通常文本)。WPF包含二另外的HeaderedItemsControl类:MenuItem和ToolBar。

树视图可以包括非TreeViewItem对象。Header属性是一个内容,可以包括一个其他元素。也可以通过HeaderTemplate,或HeaderTemplateSelector属性。

创造一个数据绑定树视图

你只是需要指定正确的数据模板。你的模板指明不同水平的数据之间的关系。

首先,定义Category类,Category类暴露Product对象的一个集合:

创造一个集合通过一个属性暴露另一个集合是用WPF数据绑定父子关系导航的关键。

为显示目录,你需要提供一个TreeView.ItemTemplate,能处理绑定对象。

使用一个HierarchicalDataTemplate对象而不是一个DataTemplate设置TreeView.ItemTemplate。HierarchicalDataTemplate能包裹第二层模板。然后,HierarchicalDataTemplate能从第一层提取一个项目集合并且提供集合到第二层模板。你只设置ItemsSource属性去识别有子项目的属性,以及设置ItemTemplate属性指明每个对象应该如何被格式化。

最终实现:在Window.Resources中创建HierarchicalDataTemplate,指向DataType为local:本地类型

DataGrid

DataGrid是一个显示数据控件,从对象的一个集合取信息和呈现它在一个行和列的网格。每个行对应于一个独立的对象,以及每个列对应于那对象一个属性。

DataGrid选择模型允许你选择是否用户能选择一个行,多个行,或一些单元格的联合。

为创造一个DataGrid,你能使用自动的列生成。你需要设置AutoGenerateColumns属性为真(这是默认值):

填充列表控件设置ItemsSource属性:

对于自动的列生成,DataGrid使用反射在绑定数据对象中查找每个公开的属性。它为每个属性创造一个列。

为显示非字符串属性,DataGrid调用ToString()。对于数字,日期,和另外的简单的数据类型工作良好。

重新修改尺寸和重新布置列

为设置ColumnWidth属性,你提供一个DataGridLength对象

  • grid.ColumnWidth = new DataGridLength(150);
  • grid.ColumnWidth = DataGridLength.SizeToHeader;制造足够宽容纳它们的标头文本
  • DataGridLength.SizeToCells。列只能自动加宽,不能自动收缩。
  • DataGridLength.Auto,每个列的宽度适合最大的单元格或列标头文本。
  • DataGrid支持使用星号设置宽度。你需要显式地设置每个列对象的Width属性。
  • CanUserResizeColumns为假阻止用户修改DataGrid的列尺寸。
  • CanUserResize为假阻止用户修改单独列尺寸
  • MinWidth阻止用户使列极端地窄。
  •  设置DataGrid的CanUserReorderColumns属性或指定的列的CanUserReorder属性为假。阻止用户拖拽列位置

定义列

  • 设置AutoGenerateColumns为假。然后显式地定义列,设置列配置,指定列顺序。

DataGrid支持几个类型的列,这表现为派生自DataGridColumn不同的类:

  • DataGridTextColumn:显示文本TextBlock
  • DataGridCheckBoxColumn:显示复选框
  • DataGridHyperlinkColumn:显示可点击的链接
  • DataGridComboBox:编辑模式改变为下拉组合框。
  • DataGridTemplateColumn:显示图像数据或专门的WPF控件

定义列,设置三细节:标头文本,列的宽度,和绑定获得数据。Header,Width,Binding

另外两个属性包括:Visibility,DisplayIndex属性。

DataGridCheckBoxColumn

Binding属性提取数据设置IsChecked属性。Content显示复选框旁边,包含IsThreeState属性,决定是否复选框支持未定状态,显示可空Boolean值信息,你能设置IsThreeState属性为真。那样,用户点击未定状态(轻阴影复选框)返回绑定值为空。

DataGridComboBoxColumn

最初显示普通文本,但是在编辑模式时,允许用户从组合框控件选取一个项目

填充组合框设置ItemsSource

绑定整个的对象列表,设置三属性:DisplayMemberPath显示字段。SelectedValuePath抽取字段。SelectedValueBinding说明绑定属性

DataGridTemplateColumn

它允许你定义二模板:一对于数据显示(CellTemplate)和一对于数据编辑(CellEditingTemplate)。

数据显示使用:1 创建DataGridTemplateColumn,2 创建 DataGridTemplateColumn.CellTemplate 
3 创建 DataTemplate 4 然后创建标签。

格式化和样式化列:

能设置Foreground,FontFamily,FontSize,FontStyle,和FontWeight属性。DataGridTextColumn没有暴露TextBlock所有的属性。例如,没办法设置Wrapping属性。

ElementStyle属性让你创造一个样式,那被应用于DataGrid单元格的内部元素

格式化行

LoadingRow事件对于行格式化是一个强力的工具。通过它能访问当前的行的数据对象,执行简单的范围核对

于每个行当它出现在屏幕上时,LoadingRow事件激发一次。

显示行细节

首先你需要定义在行细节区域显示内容,依靠设置DataGrid.RowDetailsTemplate属性。

使用:1 创建RowDetailsTemplate 2 创建DataTemplate 3 创建TextBlock

冻结列

为使用列冻结,你设置DataGrid.FrozenColumnCount属性为一个比0更大的数。例如,一个值1恰好冻结第一列:

选择

如同一个普通的列表控件,DataGrid让用户选择单独的项目。你能反应SelectionChanged事件当这发生。为找出哪一个数据对象是目前选择,你能使用SelectedItem属性。如果你希望用户能选择多个行,设置SelectionMode属性为Extended。(Single是唯一另外的选项和默认。)为选择多个行,用户必须按下Shift或Ctrl键。你能从SelectedItems属性取回选择项目的集合。

你能以编程方式设置选择,依靠使用SelectedItem属性。如果你设置的选择项目当前看不到,随后调用DataGrid.ScrollIntoView()方法,滚动表格使被选择项可见。

编辑

DataGrid的最大便利之一是它对于编辑的支持。一个DataGrid单元格切换到编辑方式当用户双击它。但是DataGrid用几个方法让你限制这编辑能力:

  • DataGrid.IsReadOnly
  • DataGridColumn.IsReadOnly
  • 只读属性:如果你的数据对象有一个没有设置器的属性,DataGrid足够智能注意这细节并且不可用列编辑,就好像你设置DataGridColumn.IsReadOnly为真。类似地,如果你的属性不是一个简单的文本,数字的,或日期类型,DataGrid使它只读。

依赖于列类型,当一个单元格切换到编辑模式,发生什么。DataGridTextColumn显示一个文本框。DataGridCheckBox列显示一个复选框你能选中或不选。但是DataGridTemplateColumn允许你用一个更专门的输入控件替换标准编辑文本框。

DataGrid的编辑事件

  • BeginningEdit:发生在单元格准备进入编辑时。
  • PreparingCellForEdit:用于模板列。这时,你能执行任何编辑控件要求的最后初始化。
  • CellEditEnding:发生在单元格准备退出编辑模式时。
  • RowEditEnding:发生在用户编辑当前行之后导航到新行。

 

参考文献:
资源:https://www.cnblogs.com/zhili/p/WPFResourceAndStyle.html参考文献:

资源:https://www.cnblogs.com/xinaixia/p/5516177.html

共享资源ComponentResourceKeyhttps://www.cnblogs.com/luohengstudy/articles/3103539.html

WPF——样式和行为https://www.cnblogs.com/renhao0118/p/3460421.html

控件模板:https://www.cnblogs.com/3xiaolonglong/p/9791681.html

WPF数据绑定:https://www.cnblogs.com/anbylau2130/p/3407957.html

格式化绑定数据:https://www.cnblogs.com/xiezunxu/articles/9257294.html

格式化绑定数据2:https://www.cnblogs.com/cuishengli/archive/2013/06/13/3134229.html

WPF列表,树,网格:https://blog.csdn.net/dyllove98/article/details/9147573

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值