公益网站建设,重庆百度关键词优化软件,芜湖十大网络公司,网站建设与规划结论WPF 表格控件 ReoGrid 的简单使用目录一、概述二、安装三、添加控件四、加载 Excel五、属性设置六、支持触摸滚动七、其它操作1、显示和隐藏列2、显示特定字体八、资源链接独立观察员 2021 年 7 月 9 日一、概述ReoGrid 是一个开源的表格控件库#xff0c;支持 Winform 和 WPF… WPF 表格控件 ReoGrid 的简单使用目录一、概述二、安装三、添加控件四、加载 Excel五、属性设置六、支持触摸滚动七、其它操作1、显示和隐藏列2、显示特定字体八、资源链接独立观察员 2021 年 7 月 9 日 一、概述ReoGrid 是一个开源的表格控件库支持 Winform 和 WPF。本文演示在 WPF 中的使用用的是直接加载 Excel 的方式另外解决了触摸滑动的问题。 二、安装新建好 WPF 项目后我们使用 NuGet 安装 ReoGrid。直接搜索 “ReoGrid”选择 unvell.ReoGridWPF当前最新版是 3.0.0但是这个版本有点问题所以我们安装 2.2.0 版本如下图那么 3.0.0 版本有什么问题呢参见 GitHub 上的一个 issuehttps://github.com/unvell/ReoGrid/issues/410 简单来说就是拖动滚动条到最边上3.0.0 版本会出现多余的空白如果固定了表头还会看到突出的表头线这个是 Excel 机制决定的主要还是空白的问题如下图 三、添加控件在 Xaml 中引入命名空间然后添加 ReoGridControlxmlns:reoGridclr-namespace:unvell.ReoGrid;assemblyunvell.ReoGridreoGrid:ReoGridControl x:NamereoGridControl WidthAuto HeightAuto Margin0 ReadonlyTrue SheetTabNewButtonVisibleFalse ShowScrollEndSpacingFalse SheetTabVisibleFalse/设计界面就自动出现预览效果了 如果取消只读设置可以直接进行编辑 四、加载 Excel我们先在项目中添加一个 Excel生成操作设置为 Resource资源 然后使用如下方法载入 Excel 内容到控件中在构造函数中调用该方法/// summary
/// 载入数据
/// /summary
private void LoadData()
{Dispatcher.BeginInvoke(new Action(() {var workbook reoGridControl;try{using (Stream stream Application.GetResourceStream(new Uri(/WPFPractice;component/Docs/ 合并中英文对照并换行显示.xlsx, UriKind.Relative)).Stream){workbook.Load(stream, FileFormat.Excel2007);}}catch (Exception ex){_VM.ShowInfo($ 载入用户权限表异常{ex});}}));
}在 ReoGrid 中ReoGridControl 控件对象就代表了一个 WorkBook和 Excel 对应。workbook 通过加载 Excel 的文件资源流来呈现内容。 五、属性设置/// summary
/// 设置控件
/// /summary
private void SetReoGridControl()
{Dispatcher.BeginInvoke(new Action(() {// 滚动条设置//var workbookSettingsDisable WorkbookSettings.View_ShowScrolls;//reoGridControl.DisableSettings(workbookSettingsDisable);var worksheet reoGridControl.CurrentWorksheet;worksheet.SelectionStyle WorksheetSelectionStyle.None; // 选择范围样式// 冻结行和列worksheet.FreezeToCell(2, 1, FreezeArea.LeftTop);// 禁用显示行和列头var worksheetSettingsDisable WorksheetSettings.View_ShowRowHeader | WorksheetSettings.View_ShowColumnHeader;worksheet.DisableSettings(worksheetSettingsDisable);// 设置只读var worksheetSettingsEnable WorksheetSettings.Edit_Readonly;worksheet.EnableSettings(worksheetSettingsEnable);// 设置显示的行数和列数worksheet.SetCols(3);worksheet.SetRows(13);}));
}属性设置通常是针对 Worksheet 来进行可参考官方文档https://reogrid.net/document/settings/ 。以上方法依次进行了如下操作去除了选择的样式冻结了前两行和第一列固定表头去除了行和列的序号设置只读设置需要显示的行和列范围。效果如下 可以看到固定了表头后还是会有表头线突出这是因为窗体或者说显示范围比表格内容区域大实际使用时可通过设置合适的显示大小ReoGrid 控件会自动出现滚动条即可解决这个问题3.0.0 版本不行如下所示 可以看到滚动条滑到最边上并没有空白出现也就看不到突出的表头线了。 至于其它的表格样式调整直接在 Excel 中调整即可效果和源文件略有差异 六、支持触摸滚动到目前为止在触摸屏下是只支持触摸滚动条进行内容滚动的直接在表格内容区进行触摸滚动是没有效果的。这个应该是 WPF 的 ScrollViewer 本身的问题之前碰到过网上有人提供过一个方法来解决通过附加属性。这里如果要支持表头固定就要用控件自己添加的 ScrollViewer也就不能直接用那个方法所以我改了个专用的方法。各种情况如下// 命名空间
xmlns:rgclr-namespace:unvell.ReoGrid;assemblyunvell.ReoGrid
xmlns:utilsclr-namespace:WPFPractice.Utils// 普通使用
rg:ReoGridControl x:NamereoGridControl SheetTabNewButtonVisibleFalse ShowScrollEndSpacingFalse SheetTabVisibleFalse ReadonlyTrue/// 支持触摸滚动WpfTouchScrollHelper 见 https://gitee.com/dlgcy/WPFTemplate
ScrollViewer wpfHelpers:WpfTouchScrollHelper.IsEnabledTrue HorizontalScrollBarVisibilityAuto VerticalScrollBarVisibilityAutoGrid WidthAuto HeightAutorg:ReoGridControl Width1150 Height2100 x:NamereoGridControl SheetTabNewButtonVisibleFalse ShowScrollEndSpacingFalse SheetTabVisibleFalse ReadonlyTrue//Grid
/ScrollViewer// 支持触摸滚动 2ReoGridTouchScrollHelper兼容固定表头冻结
rg:ReoGridControl WidthAuto HeightAuto x:NamereoGridControl SheetTabNewButtonVisibleFalse ShowScrollEndSpacingFalse SheetTabVisibleFalse ReadonlyTrue Margin0 utils:ReoGridTouchScrollHelper.IsEnabledTrue/其中 ReoGridTouchScrollHelper 的代码如下using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
using unvell.ReoGrid;namespace WPFPractice.Utils
{/// summary/// 参考 WpfTouchScrollHelper 见 https://gitee.com/dlgcy/WPFTemplate/// 用法引入命名空间 (比如 util) 后在 ReoGrid 上写上 util:ReoGridTouchScrollHelper.IsEnabledTrue/// /summarypublic class ReoGridTouchScrollHelper : DependencyObject{public static bool GetIsEnabled(DependencyObject obj){return (bool)obj.GetValue(IsEnabledProperty);}public static void SetIsEnabled(DependencyObject obj, bool value){obj.SetValue(IsEnabledProperty, value);}public bool IsEnabled{get { return (bool)GetValue(IsEnabledProperty); }set { SetValue(IsEnabledProperty, value); }}public static readonly DependencyProperty IsEnabledProperty DependencyProperty.RegisterAttached(IsEnabled, typeof(bool), typeof(ReoGridTouchScrollHelper), new UIPropertyMetadata(false, IsEnabledChanged));public static Dictionaryobject, MouseCapture _captures new Dictionaryobject, MouseCapture();/// summary/// 开关触发事件/// /summarypublic static void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var target d as ReoGridControl;if (target null) return;if ((bool)e.NewValue){target.Loaded Target_Loaded;}else{target.Loaded - Target_Loaded;Target_Unloaded(target, new RoutedEventArgs());}}/// summary/// 启用/// /summarypublic static void Target_Loaded(object sender, RoutedEventArgs e){var target sender as ReoGridControl;if (target null) return;System.Diagnostics.Debug.WriteLine(Target Loaded);target.Unloaded Target_Unloaded;target.PreviewMouseLeftButtonDown Target_PreviewMouseLeftButtonDown;target.PreviewMouseMove Target_PreviewMouseMove;target.PreviewMouseLeftButtonUp Target_PreviewMouseLeftButtonUp;}/// summary/// 禁用/// /summarypublic static void Target_Unloaded(object sender, RoutedEventArgs e){System.Diagnostics.Debug.WriteLine(Target Unloaded);var target sender as ReoGridControl;if (target null) return;_captures.Remove(sender);target.Unloaded - Target_Unloaded;target.PreviewMouseLeftButtonDown - Target_PreviewMouseLeftButtonDown;target.PreviewMouseMove - Target_PreviewMouseMove;target.PreviewMouseLeftButtonUp - Target_PreviewMouseLeftButtonUp;}/// summary/// 鼠标左键按下/// /summarypublic static void Target_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e){var target sender as ReoGridControl;if (target null) return;_captures[sender] new MouseCapture{HorticalOffset e.GetPosition(target).X,VerticalOffset e.GetPosition(target).Y,Point e.GetPosition(target),};}/// summary/// 鼠标左键抬起/// /summarypublic static void Target_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e){var target sender as ReoGridControl;if (target null) return;target.ReleaseMouseCapture();}/// summary/// 鼠标移动/// /summarypublic static void Target_PreviewMouseMove(object sender, MouseEventArgs e){if (!_captures.ContainsKey(sender)) return;if (e.LeftButton ! MouseButtonState.Pressed){_captures.Remove(sender);return;}var target sender as ReoGridControl;if (target null) return;var capture _captures[sender];var point e.GetPosition(target);var dy point.Y - capture.Point.Y;var dx point.X - capture.Point.X;if (Math.Abs(dy) 5){target.CaptureMouse();}if (Math.Abs(dx) 5){target.CaptureMouse();}//target.ScrollCurrentWorksheet(capture.HorticalOffset - dx,capture.VerticalOffset - dy);//target.ScrollCurrentWorksheet(dx,dy);target.ScrollCurrentWorksheet(-dx,-dy);}/// summary/// 鼠标快照/// /summarypublic class MouseCapture{public double VerticalOffset { get; set; }public double HorticalOffset { get; set; }public Point Point { get; set; }}}
}这样就能通过触摸内容区来进行滚动了。不过也有缺点因为滚动条也是在控件范围内所以有点受影响不知道大家有没有什么好方法。 七、其它操作1、显示和隐藏列比如可以根据用户权限来显示和隐藏列主要是使用 Worksheet 的 ShowColumns () 和 HideColumns () 方法来设置 2、显示特定字体官方文档https://reogrid.net/document/style/指明了设置字体的方法 另外一种方法依然是直接在 Excel 中设置字体。当然无论用哪种方法如果电脑里没有安装该字体则还是没有效果的可考虑通过代码自动安装字体可参考https://gitee.com/dlgcy/dotnetcodes/blob/cd6d091d3c082ec1f7f450b0e4aec61c6a1ea5cd/DotNet.Utilities/FontHelper.cs。 八、资源链接官网文档https://reogrid.net/document/GitHubhttps://github.com/unvell/ReoGridGitee 克隆https://gitee.com/DLGCY_Clone/ReoGrid本文示例https://gitee.com/dlgcy/Practice/tree/Blog20210709/WPFPracticeWPF【翻译】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组件第三方库使用OxyPlot.WPF 公共属性一览OxyPlot.Wpf 图表控件使用备忘