WPF
文章平均质量分 73
梦李寻欢
纸上得来终觉浅,绝知此事要躬行.
展开
-
ItemsControl 类控件子项拖放
在装饰器里面封装这些事件,这里面定一个了一个依赖属性 ItemType,需要在使用装饰器时指定ItemType,应为ItemsSource集合中元素的类型,在拖放响应DropEvent 事件时进行校验,如果拖放的数据与ItemType类型一致,才接收拖放数据。要实现拖放功能,关键点还是在按下鼠标并移动时,调用 DoDragDrop 方法以触发拖动动作,然后在拖放目标上响应 DropEvent 事件。原创 2024-05-20 18:09:42 · 225 阅读 · 0 评论 -
WPF拖放控件
对拖放相关事件研究后发现,最终只需要在拖动源事件处理程序中调用 DoDragDrop 方法启动拖动操作,然后在拖放目标上,响应Drop事件。除了正常拖动(将Tab页从一个TabControl 拖动到另一个 TabControl 中),考虑将Tab页拖动到窗口之外的情况(浏览器在这种情况下会创建一个新的窗口来显示这个Tab页),我这里采用类似的方式,创建一个预设的子窗口来显示该Tab页面。此外,当Tab页面在原TabControl内部拖动时,根据拖动位置,调整Tab页面的顺序。原创 2024-05-20 15:25:36 · 695 阅读 · 0 评论 -
WPF枚举绑定
此示例演示如何绑定到枚举。遗憾的是,没有直接方法可以将枚举用作数据绑定源。但是,Enum.GetValues(Type) 方法可返回值的集合。这些值可以包装在 ObjectDataProvider 中并用作数据源。ObjectDataProvider 类型提供了一种在 XAML 中创建对象并将其用作数据源的便捷方式。使用 ObjectDataProvider 类型包装枚举类型本身提供的枚举值数组。实际上,XAML 正在分解方法调用、方法名称、参数和返回类型。原创 2023-09-20 16:17:05 · 708 阅读 · 0 评论 -
WPF控件模板2
如果创建元素类型样式ScrollBar,并将其添加到窗口的Resources集合中,对于窗口的所有控件,无论何时使用ScrollBar控件,都会具有新样式的滚动条,这可能正是您所希望的效果。为成功地创建控件模板,需要仔细查看相关控件的标准模板,并注意分析这些技术的用法,然后将它们应用到自己的模板中。这是该模板特有的实现细节,可确保Thumb元素总有相同的尺寸(通常,滑块根据内容按比例地改变尺寸,因此如果滚动的内容在窗口中基本上能够显示,这是滑块会变得较长)。按钮控件的模板可分解成几个较简单的部分。原创 2023-09-20 13:54:39 · 359 阅读 · 0 评论 -
WPF控件模板
简单的说,自定义控件是必须的内容——它们是实现新颖时髦的用户界面的唯一方法,但支持它们并将它们集成到应用程序中也是一件棘手的事情。如果查看Button类的控件模板,就会发现在模板绑定的使用方法上,与自定义模板是完全相同的——获取为按钮指定的内边距,并将它转换为ContentPresenter元素周围的外边距。当选择使用类似Button的控件时,是希望得到类似按钮的行为(换句话说,选择的是一个元素,该元素提供了能被单击的内容,通过单击来触发动作,并且可用做窗口上的默认按钮或取消按钮)。原创 2023-09-19 16:38:51 · 526 阅读 · 0 评论 -
WPF行为
然而,WPF支持触发器,行为特性包含自己的触发器系统,而触发器系统与WPF模型不匹配,这确实令人感到有些困惑。其思想很简单:创建封装了一些通用用户界面功能的行为,这一功能可以是基本功能(如启动故事板或导航到超链接),也可以是复杂功能(如处理多点触摸交互,或构件使用实时物理引擎的碰撞模型)。一旦构建功能,就可将他们添加到任意应用程序的另一个控件中,具体方法是将该控件链接到适当的行为并设置行为的属性。但通过付出更多一点的努力,可将该代码转换为可重用的行为,该行为可为Canvas面板上的所有元素提供拖动支持。原创 2023-09-18 16:04:40 · 554 阅读 · 0 评论 -
WPF样式
样式是可应用与元素的属性值集合。WPF样式也支持触发器,当属性发生变化时,可通过触发器改变控件的样式,并可以通过模板重新定义控件的内置外观。除非有特殊原因要求一个样式继承自另一个样式(例如,第二个样式是第一个样式的特例,并且只改变了继承来的大量设置中的几个特征),否则不要使用样式继承。如果需要使用此功能,可能更好的选择是事件触发器,它以声明的方式定义了所希望的行为(并且不需要任何代码)。唯一的规则是,如果两次设置了同一个属性,最后的属性设置器(在继承链中最远的派生类中设置器)会覆盖其他以前的定义。原创 2023-09-15 13:44:07 · 313 阅读 · 0 评论 -
WPF命令
编写代码完成这些工作(并在后面添加代码以启用这些控件)是很麻烦的,更糟的是,如果没有正确完成这项工作,可能会使不同状态的代码块不正确的相互重叠,从而导致某个控件在可应该可用时而被启用。然而,有工具栏上的按钮触发的命令是完全独立的元素。这个过程之所以能够无缝工作,是因为按钮被放到工具栏上,ToolBar提供了一些内置逻辑,可将其子元素的CommandTarget属性动态设置为当前具有焦点的控件(从技术角度看,ToolBar控件一直在关注着其父元素,及窗口,并在上下文中查找最近具有焦点的控件,即文本框。原创 2023-09-08 18:23:54 · 672 阅读 · 0 评论 -
WPF元素绑定
如果希望根据其他运行时信息修改绑定,或者根据环境创建不同的绑定,这时使用代码创建绑定通常更合理(此外,也可以在窗口的Resources集合中定义可能希望使用的每个绑定,并只添加使用合适的绑定对象调用SetBinding() 方法的代码)。如果指定的元素或属性不存在,那么不会收到任何指示,只是不能在目标属性中显示数据。使用代码创建绑定时,先创建一个绑定对象,构造函数参数指定Path字段,然后设置Binding相关的属性值,通过绑定目标的SetBinding函数,将绑定目标的属性与Binding对象关联即可。原创 2023-09-05 17:35:47 · 902 阅读 · 0 评论 -
DataGrid
它还提供了行的 DataGridRow 对象,允许开发人员使用不同的颜色或不同的字体设置行的格式。对于简单的 DataGridTextColumn,该元素是 TextBlock,对于DataGridCheckBoxColumn ,单元格内部的元素是复选框,可使用 EditingElementStyle 属性为编辑列时使用的元素提供样式。例如,不能控制列的顺序、每列的宽度、如何格式化列中的值以及应该放在顶部的标题文本的内容。2、可配置行细节区域,从而只为选择的行显示该区域,当不需要时允许用户折叠额外的细节。原创 2023-09-04 18:11:17 · 193 阅读 · 0 评论 -
TreeView
TreeView 控件经常用于包含大量数据,这是因为TreeView 控件的显示是能够折叠的。完全可以在TreeView 控件中省略不显示的信息,以便降低开销。可通过处理这两个事件即时填充丢失的节点或丢弃不需要的节点。相反,每个TreeViewItem 对象都是单独的ItemsControl 控件,可以包含更多TreeViewItem 对象。尽管这个标记工作的很好,单分解每个数据模板并通过数据类型(而不是通过位置)将模板应用到数据对象的情况更加普遍。实际上,现在有两个模板,每个模板用于树控件中的每个层次。原创 2023-09-04 13:52:57 · 398 阅读 · 0 评论 -
ListView
这里除了ViewBase 所需的DefaultStyleKey 与 ItemContainerDefaultStyleKey 外,还另外定义了三个属性:ItemTemplate、SelectedBackground、SelectedBorderBrush,其中ItemTemplate用于使用时提供正确的数据模板,SelectedBackground与SelectedBorderBrush用于为视图传递额外信息,在视图样式中可以绑定到这两个属性来使用。ListView 继承自简单的没有特色的ListBox。原创 2023-09-04 10:45:15 · 127 阅读 · 0 评论 -
WPF数据视图
例如,可将同一个集合绑定到两个不同的列表,并对集合进行过滤以显示不同的记录。我实测下来,绑定自同一个数据源的ItemsControl控件会共享一个View,当对该View进行筛选、排序时,会应用到所有绑定到该数据源的控件。将集合绑定到ItemsControl控件时,会不加通告的在后台创建数据视图——位于数据源和绑定的控件之间。数据视图是进入数据源的窗口,可以跟踪当前项,并且支持各种功能,如排序、过滤、分组。可以看到,可以直接通过数据源来获取视图,这也表明,绑定到同一个数据源的控件会公用一个视图。原创 2023-09-01 10:20:18 · 1544 阅读 · 0 评论 -
WPF数据模板
样式提供了基本的格式化能力,但它们不能消除到目前为止看到的列表的最重要的局限性:不管如何修改ListBoxItem,它都只是ListBoxItem,而不是功能更强大的元素组合。模板选择器是一种更强大的工具,可以根据不同的条件应用完全不同的模板。然而WPF另有一个工具可突破这个相当大的限制,并允许组合使用来自绑定对象的多个属性,并以特定的方式排列它们或显示比简单字符串更高级的可视化表示。实现了IValueConverter接口的类,能够将值从绑定的对象转换为可用于设置模板中与格式化相关的属性的值。原创 2023-08-31 15:34:07 · 784 阅读 · 0 评论 -
WPF列表样式
WPF的数据绑定系统自动生成列表项对象,为单个项应用所需的样式不是很容易。如果设置了ItemContainerStyle 属性,当创建列表项时,列表控件会将其向下传递给每个项。对于ListBox控件,每个项有ListBoxItem 对象表示,对于CombBox 控件,则对应是 CombBoxItem。可以使用样式选择器来为不同的子项提供不同的样式,自定义样式选择器需要继承自 StyleSelector 类,需要重写 SelectStyle() 方法。也可以直接将样式设置到ListBox层次。原创 2023-08-30 16:35:05 · 1305 阅读 · 0 评论 -
WPF数据转换
多重绑定的值转换器需要实现的接口是 IMultiValueConverter,与 IValueConverter 接口比较类似,只是转换函数的第一个参数改成了数组形式。可以看到后面两个StringFormat属性以花括号 {} 开头,完整值是 {}{0:C},而不是 {0:C},第一个则只有 {0:C},这是因为在StringFormat 值以花括号开头时需要 {} 转义序列。该功能更强大,使用该功能可以将任意类型的源数据转换为任意类型的对象表示,然后可以传递到关联的控件。原创 2023-08-30 14:04:42 · 1286 阅读 · 0 评论 -
WPF 数据验证
可以在设置属性时抛出异常,通常WPF会忽略所有在设置属性时抛出的异常,但可以进行配置,从而显示更有帮助的可视化指示。使用装饰层,可添加可视化装饰来指示错误,而不用替换控件背后的控件模板或改变窗口的布局。如果需要执行对两个或更多个绑定值的验证,可以通过 BindingGroup 来实现,将需要校验的多个控件放置于同一个容器中,在容器级别应用验证规则,需要通过事件主动触发验证,通常是子组件失去焦点时。更好的是,因为是在不同类中定义验证,可以很容易的在存储类似数据类型的多个绑定中重用验证。原创 2023-08-29 15:57:15 · 1673 阅读 · 0 评论 -
列表类控件虚拟化
1、在ScrollViewer中放置列表控件,ScrollViewer为其子内容提供了一个无限虚拟空间,在这个虚拟空间内,列表控件可以完整尺寸渲染自身,显示所有子项。可以通过延迟滚动来进一步提升性能,开启延迟滚动后,在滚动滑块时不会更新列表显示,只有当用户释放滚动滑块时才刷新。TreeView也是使用的VirtualizingStackPanel面板,但是默认情况下关闭了该支持,可以通过配置 VirtualizingStackPanel.IsVirtualizing="True" 来启用。原创 2023-08-28 16:46:03 · 860 阅读 · 0 评论 -
WPF数据绑定
其中,ComboBox绑定到ListBox所选择的项,根据ListBox选择的项的Instruments属性来填充其子项,而下面的StackPanel 的 DataContext 又绑定到ComboBox选择的项,三个TextBlock控件展示ComboBox所选择项的各项属性。绑定到集合的数据类型可以是任意类型的集合,唯一的要求是支持IEnumerable 接口,数组、各种类型的集合以及许多特殊的封装了数据项组的对象都支持该接口。在填写表单时候,经常会遇到根据前面选定的项,自动调整后面选项的内容的情况。原创 2023-08-28 14:40:21 · 662 阅读 · 0 评论