WPF 学习笔记系列是笔者在学习 WPF 并开发 路遥工具箱 时遇到的一些问题的记录和解决方案。因知识点过于琐碎,针对每个问题都单开博客显得比较小题大作,故此才形成了 WPF 学习笔记系列博文。
WPF 应用开发中可编辑 ComboBox 的数据绑定
设置 ComboBox 的 IsEditable 属性为 True 可以让 ComboBox 支持用户编辑。这种情况下,如果需要获取用户编辑后的数据,绑定 SelectedItem 或 SelectedValue 均无法获取正确的结果。为了解决这个问题,需要将绑定设置在 ComboBox 的 Text 属性上:
<ComboBox IsEditable="True" x:Name="GroupComboBox" Text="{Binding GroupName}"></ComboBox>
TextBlock 文字超出宽度后显示省略号
设置 TextBlock 的 TextTrimming 属性为 CharacterEllipsis 可以在文本超长时显示省略号:
<TextBlock TextTrimming="CharacterEllipsis" Text="{Binding Result}"></TextBlock>
自定义按钮样式后按钮很难点击到或按钮背景点击不到
如果为按钮自定义了样式,比如在按钮上显示了 Path 或一张图片。可能会遇到按钮点击画图外区域命令不响应的问题,如果定义的 Path 过小,就会让按钮很难点到。产生这个问题的原因是没有为模板设置背景,导致命令事件没有捕获。解决方案就是在按钮模板最外层嵌套一个 Border 元素并将其背景色设置为透明。
如果你在处理 Mouse 相关事件时遇到问题,也有可能是背景色未设置造成的。
在 XAML 中为列表进行排序
有时需要在前端界面中(XAML)对数据进行排序,但 MVVM 中后端 ViewMode 暴露的 ObservableCollection 不支持排序功能。在数据量较小时,可以通过先删除排序好后再添加的方式实现数据排序。在数据量较大时,这样做就会造成系统卡顿,解决方案之一就是在前端直接使用 CollectionViewSource 进行排序。
关于 CollectionViewSource 的详情,可以参见微软的帮助文档:CollectionViewSource 类 。
首先引入 scm 命名空间:
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
创建数据源,并指定排序方式:
<UserControl.Resources>
<CollectionViewSource x:Key="GroupItemsSource" Source="{Binding GroupItems}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Value"></scm:SortDescription>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</UserControl.Resources>
以上代码设置数据源为 VM 中的 GroupItems ,并按照 Value 属性进行排序。