小程序建站平台哪个好,网站备案号 如何添加,成都设计公司名字,安卓手机优化大师官方下载WPF DataGrid 如何将被选中行带到视野中目录前言准备工作方法一方法二总结独立观察员 2021 年 12 月 11 日前言在 WPF 开发中#xff0c;显示表格一般使用 DataGrid 控件#xff0c;而且我们一般会依据用户的选中行的操作来执行一些逻辑#xff0c;这种情况#xff0c;选中… WPF DataGrid 如何将被选中行带到视野中目录前言准备工作方法一方法二总结独立观察员 2021 年 12 月 11 日前言在 WPF 开发中显示表格一般使用 DataGrid 控件而且我们一般会依据用户的选中行的操作来执行一些逻辑这种情况选中了哪一行用户是心知肚明的。而还有一种情况我们可能在业务逻辑中由程序自己选中了某一行如果这一行当前不在用户界面的可视区换句话说也就是滚动条没有滚到那个位置那么我们如何将其带到用户的视野中呢准备工作今天准备介绍两个方法。正所谓工欲善其事必先利其器所以在开始之前我们先来构建一个可以模拟后台选中行的功能。使用的还是之前用过的 DataGrid 的 Demo 程序在《WPF DataGrid 通过自定义表头模拟首行固定》和《WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题》中用过加了一个可以填写要选中的行号的文本框以及一个执行选中操作的按钮下面来演示一下没有自动将选中行带到视野中的情况。我们先将数据添加到 10 条然后缩小程序的窗口这样有些数据就在滚动区外面了也就是不在视野中。然后我们通过程序来选中行可以看到选中功能是正常的但是对于视野外的数据用户看不到其是否选中需要手动滚动来寻找如下图动图好那接下来就介绍怎么解决吧。方法一这个方法是参考《【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF》文章中的将 TreeViewItem树状列表项带到视野中的方法我稍微改造了一下使其同时支持 DataGridRow 和 TreeViewItem并且之后如果有其它受支持的类型也可以方便地扩展。BringIntoViewBehavior 类提供了一个 IsBroughtIntoViewWhenSelected 附加属性给每个列表项的 Selected 事件指定了处理方法处理方法中调用 BringIntoView () 方法完整代码如下using System.Windows;
using System.Windows.Controls;
/** 源码已托管https://gitee.com/dlgcy/WPFTemplateLib*/
namespace WPFTemplateLib.WpfHelpers
{/// summary/// 功能列表项被选中时带到视野中/// 参考http://dlgcy.com/introduction-to-attached-behaviors-in-wpf//// 说明用于 DataGrid 时需要设置 EnableRowVirtualizationFalse/// /summary/// example/// code/// Setter PropertywpfHelpers:BringIntoViewBehavior.IsBroughtIntoViewWhenSelected ValueTrue//// /code/// /examplepublic class BringIntoViewBehavior{#region IsBroughtIntoViewWhenSelectedpublic static bool GetIsBroughtIntoViewWhenSelected(FrameworkElement item){return (bool)item.GetValue(IsBroughtIntoViewWhenSelectedProperty);}public static void SetIsBroughtIntoViewWhenSelected(FrameworkElement item, bool value){item.SetValue(IsBroughtIntoViewWhenSelectedProperty, value);}/// summary/// 是否在选中时带到视野中/// /summarypublic static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty DependencyProperty.RegisterAttached(IsBroughtIntoViewWhenSelected,typeof(bool),typeof(BringIntoViewBehavior),new UIPropertyMetadata(false, OnIsBroughtIntoViewWhenSelectedChanged));static void OnIsBroughtIntoViewWhenSelectedChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e){FrameworkElement item depObj as FrameworkElement;if (item null)return;if (e.NewValue is bool false)return;switch (depObj){case DataGridRow row:{if ((bool)e.NewValue)row.Selected OnItemSelected;elserow.Selected - OnItemSelected;break;}case TreeViewItem treeViewItem:{if ((bool)e.NewValue)treeViewItem.Selected OnItemSelected;elsetreeViewItem.Selected - OnItemSelected;break;}default:break;}}static void OnItemSelected(object sender, RoutedEventArgs e){// 忽略所有只是报告子孙的 Selected 被触发的祖先。if (!ReferenceEquals(sender, e.OriginalSource))return;if (e.OriginalSource is FrameworkElement item)item.BringIntoView();}#endregion}
}此方法用于 DataGrid 时需要设置 EnableRowVirtualizationFalse默认为 true使用时只要在行样式中应用这个附加属性即可注意引入命名空间效果如下动图方法二如果开了行虚拟化EnableRowVirtualizationTrue离可视区较远的行的 Selected 事件就不会被触发以上方法就不行了。类似于这个帖子的情况《WPF 开启行虚拟化的时候行选择功能不正常求解决方案》https://bbs.csdn.net/topics/392666509所以如果因为数据量比较大必须开启行虚拟化时可以使用下面的方法。先给 DataGrid 命个名如 x:NameDg 方便后台使用然后在 ViewModel 中添加一个选中项改变事件 SelectedItemChanged并在选中项改变时调用参数为选中行的索引/// summary
/// 选中项改变事件
/// /summary
public event Actionint SelectedItemChanged;private User _SelectedItem;
/// summary
/// 选中项
/// /summary
public User SelectedItem
{get _SelectedItem;set{SetProperty(ref _SelectedItem, value);SelectedItemChanged?.Invoke(Datas.IndexOf(_SelectedItem));}
}接着在后台事件中注册事件处理方法处理方法中调用了 DataGrid 的 ScrollIntoView 方法代码如下_vm.SelectedItemChanged OnSelectedItemChanged;/// summary
/// 选中项改变事件执行方法
/// /summary
/// param nameindex选中行索引/param
private void OnSelectedItemChanged(int index)
{Dg.ScrollIntoView(Dg.Items.GetItemAt(index));
}效果和方法一的一样就不再赘述了。总结关于将 DataGrid 选中行带到视野中的需求本文介绍了两种方法。方法一提供了一个附加属性可以方便地实现该需求不过要求不能开启行虚拟化。方法二则是需要在 ViewModel 和页面后台编写代码通过事件来触发相关操作不过可以支持行虚拟化。大家可以依据实际情况选择使用如果有更好的方法欢迎交流。 源代码地址https://gitee.com/dlgcy/DLGCY_WPFPractice/tree/Blog20211211 WPFWPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题WPF DataGrid 通过自定义表头模拟首行固定WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPFWPF 使用 Expression Design 画图导出及使用 Path 画图WPF MVVM 弹框之等待框解决 WPF 绑定集合后数据变动界面却不更新的问题使用 ObservableCollectionWPF 消息框 TextBox 绑定新数据时让光标和滚动条跳到最下面真・WPF 按钮拖动和调整大小WPF MVVM 模式下的弹窗WPF 让一组 Button 实现 RadioButton 的当前样式效果WPF 原生绑定和命令功能使用指南WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘在WPF的MVVM模式中使用OCX组件