WPF应用开发之附件管理

在我们之前的开发框架中,往往都是为了方便,对附件的管理都会进行一些简单的封装,目的是为了方便快速的使用,并达到统一界面的效果,本篇随笔介绍我们基于SqlSugar开发框架的WPF应用端,对于附件展示和控件的一些封装处理界面效果,供大家参考斧正。

1、回顾附件管理,Winform端以及VueElement的前端界面效果

由于我们统一了附件的处理方式,底层同时支持多种上传方式,FTP文件上传、常规文件上传、以及OSS的文件上传等方式,因此界面展示也是统一的话,就可以在各个界面端达到统一的UI效果,使用起来更加方便。

例如我们在Winform的系统界面中,编辑信息的一个界面里面分门别类管理很多影像学的图片资料,通过查看附件,可以看到其中一些图片附件的缩略图,需要进一步查看,可以双击图片即可实现预览效果。

上面的界面中,可以查看单项的附件数量,以及查看具体的附件列表信息。

由于Winform端的附件管理已经封装好控件了,所以在使用的时候,拖动到界面即可。

而对于Vue+Element的BS前端界面,我们也可以通过自定义组件的方式,实现统一的界面效果。

为了管理好这些附件图片等文件信息,我们在前端界面提供一些条件供查询,如下是Vue3+Element Plus的前端管理界面。

业务表单中展示附件的效果,用户界面展示如下所示。

2、WPF应用端的附件管理界面

通过以上的界面参考,我们可以借鉴的用于WPF应用端的界面设计中,设计一些自定义组件,用来快速、统一展示附件信息,WPF应用端的附件列表展示界面如下所示。

而业务表中的附件列表展示,我们参考Winform端的用户控件设计方式,先展示附件的汇总信息,然后可以查看具体的附件列表,如下界面所示。

需要查看,可以单击【打开附件】进行查看具体的附件列表,如下界面所示。

 用户控件的界面代码如下所示。

<UserControlx:Class="WHC.SugarProject.WpfUI.Controls.AttachmentControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:core="clr-namespace:SugarProject.Core;assembly=SugarProjectCore"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:hc="https://handyorg.github.io/handycontrol"xmlns:helpers="clr-namespace:WHC.SugarProject.WpfUI.Helpers"xmlns:local="clr-namespace:WHC.SugarProject.WpfUI.Controls"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Name="Attachmet"d:DesignHeight="100"d:DesignWidth="300"mc:Ignorable="d"><Grid Width="{Binding Width, ElementName=Attachmet}" MinWidth="250"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto" /><ColumnDefinition Width="Auto" /><ColumnDefinition Width="auto" /></Grid.ColumnDefinitions><TextBlockGrid.Column="0"MinWidth="100"Margin="5,0,10,0"VerticalAlignment="Center"Text="{Binding Path=Text, ElementName=Attachmet}" /><TextBlockx:Name="txtTips"Grid.Column="1"Margin="10,0,10,0"VerticalAlignment="Center" /><ButtonGrid.Column="2"Margin="10,0,10,0"VerticalAlignment="Center"Command="{Binding OpenAttachmentCommand, ElementName=Attachmet}"CommandParameter="{Binding Path=AttachmentGUID, ElementName=Attachmet}"Content="打开附件"Style="{StaticResource ButtonSuccess}" /></Grid>
</UserControl>

后端的代码和常规的自定义控件类似,定义一些属性名称,以及相关的事件处理即可,如下代码所示。

namespace WHC.SugarProject.WpfUI.Controls
{/// <summary>/// AttachmentControl.xaml 的交互逻辑/// </summary>public partial class AttachmentControl : UserControl{private static string TipsContent = "共有【{0}】个附件";/// <summary>/// 标题/// </summary>public string Text{get { return (string)GetValue(TextProperty); }set { SetValue(TextProperty, value); }}public static readonly DependencyProperty TextProperty = DependencyProperty.Register(nameof(Text), typeof(string), typeof(AttachmentControl),new FrameworkPropertyMetadata("文本说明", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));/// <summary>/// 附件组的GUID/// </summary>public string? AttachmentGUID{get { return (string?)GetValue(AttachmentGUIDProperty); }set { SetValue(AttachmentGUIDProperty, value); }}public static readonly DependencyProperty AttachmentGUIDProperty = DependencyProperty.Register(nameof(AttachmentGUID), typeof(string), typeof(AttachmentControl),new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnAttachmentGUIDPropertyChanged)));private static async void OnAttachmentGUIDPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){if (d is not AttachmentControl control)return;if (control != null){var oldValue = (string?)e.OldValue;  // 旧的值var newValue = (string?)e.NewValue; // 更新的新的值//更新数据源await control.InitData(newValue);}}/// <summary>/// 更新数据源/// </summary>/// <param name="attachmentGuid">附件GUID</param>/// <returns></returns>private async Task InitData(string attachmentGuid){int count = 0;if (!attachmentGuid.IsNullOrEmpty() && !this.IsInDesignMode()){var itemList = await BLLFactory<IFileUploadService>.Instance.GetByAttachGUID(attachmentGuid);if (itemList != null){count = itemList.Count;}}//多语言处理提示信息var newTipsContent = JsonLanguage.Default.GetString(TipsContent);this.txtTips.Text = string.Format(newTipsContent, count);}/// <summary>/// 默认构造函数/// </summary>public AttachmentControl(){InitializeComponent();}/// <summary>/// 打开附件列表/// </summary>[RelayCommand]private async Task OpenAttachment(string attachmentGuid){var dlg = App.GetService<FileUploadViewPage>();dlg!.AttachmentGUID = attachmentGuid;if(dlg.ShowDialog() == true){await this.InitData(attachmentGuid);}}}
}

最后我们通过打开一个新的页面,展示附件列表即可,附件列表,可以通过代码生成工具快速生成,根据数据库结构生成相关的界面展示代码。

关于WPF应用端界面生成,有兴趣可以参考《循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码》

界面生成后,合并到系统中即可使用。 

我们可以切换列表页面为图片列表的方式展示,如下界面所示。

如果是图片文件,我们提供一个预览的入口,利用HandyControl的图片预览控件ImageBrowser 控件实现图片的预览处理。

<DataGridTemplateColumn Width="*" Header="预览/文件"><DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel><TextBlock Text="{Binding SavePath}" Visibility="{Binding IsImage, Converter={StaticResource Boolean2VisibilityReConverter}}" /><ImageHeight="50"Margin="2"MouseLeftButtonDown="Image_MouseLeftButtonDown"Source="{Binding Converter={StaticResource FileUploadImagePathConverter}}"ToolTip="单击打开图片预览"Visibility="{Binding IsImage, Converter={StaticResource Boolean2VisibilityConverter}}" /></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

预览的事件代码如下所示。

private void Image_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e){var image = sender as Image;if (image != null){var path = ((BitmapImage)image.Source).UriSource.AbsoluteUri;var dlg = new ImageBrowser(new Uri(path));dlg.ShowTitle = false;dlg.KeyDown += (s, e) =>{if (e.Key == System.Windows.Input.Key.Escape){dlg.Close();}};dlg.ShowDialog();}}

预览界面效果图如下所示。

 以上就是我们在处理WPF端附件、图片列表的一些处理界面设计,以及一些操作过程。

文章转载自:伍华聪

原文链接:https://www.cnblogs.com/wuhuacong/p/17864501.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文献速递:机器学习在超声波非破坏性评估中的合成和增强训练数据综述(第一部分)— (机器学习方法在超声波检测中的概述)

文献速递&#xff1a;机器学习在超声波非破坏性评估中的合成和增强训练数据综述&#xff08;第一部分&#xff09;— &#xff08;机器学习方法在超声波检测中的概述&#xff09; Title 题目 A review of synthetic and augmented training data for machine learning in ul…

浅谈STL中的分配器

分配器是STL中的六大部件之一&#xff0c;是各大容器能正常运作的关键&#xff0c;但是对于用户而言确是透明的&#xff0c;它似乎更像是一个幕后英雄&#xff0c;永远也不会走到舞台上来&#xff0c;观众几乎看不到它的身影&#xff0c;但是它又如此的重要。作为用户&#xff…

rest_framework_django 学习笔记二(视图路由)

rest_framework_django 学习笔记二&#xff08;视图路由&#xff09; rest_framwork_django学习笔记一(序列化器) 一、rest framework 中Request 与 Response 1、Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象&#xff0c;二是REST Fame…

3D模型渲染导致电脑太卡怎么办?

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1、什么是3D渲染&#xff1f; 3D渲染是指通过计算机图形学技术将三维模型转化为二维图像的过程…

人工智能“排头兵”,探访福州多地 AI 智算实践

生成式 AI 在 2023 年再次引爆 IT 技术发展&#xff0c;福建作为数字中国的重要策源地&#xff0c;也是国家数字经济创新发展试验区&#xff0c;在人工智能方面拥有良好的产业基础和人才优势&#xff0c;同时近期出台的《福建省促进人工智能产业发展十条措施》&#xff0c;为福…

带键扫的LED专用驱动方案

一、基本概述 TM1650 是一种带键盘扫描接口的LED&#xff08;发光二极管显示器&#xff09;驱动控制专用电路。内部集成有MCU输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。TM1650 性能稳定、质量可靠、抗干扰能力强&#xff0c;可适用于24 小时长期…

docker buildx跨架构构建笔记(x86_64构建下构建aarch64镜像)

docker buildx跨架构构建(x86_64构建aarch64镜像) 文章目录 docker buildx跨架构构建(x86_64构建aarch64镜像)简介第一步 先交叉编译一个aarch64的HelloWorld程序。准备一个用于跨架构的Dockerfile文件使用docker buildx命令构建aarch64架构的镜像。查看镜像具体详细信息&#…

Linux常用命令——vi命令

文章目录 vi的工作模式常用快捷键提示和技巧结论 Linux环境下的vi编辑器不仅以其强大的功能著称&#xff0c;也因其快捷键而闻名。这些快捷键可以显著提高编辑效率&#xff0c;是每个使用vi的人必须掌握的。下面将扩展介绍vi的一些常用快捷键。 vi的工作模式 vi主要有两种模式…

【机器学习】线性模型之逻辑回归

文章目录 逻辑回归Sigmoid 函数概率输出结果预测值与真实标签之间的并不匹配交叉熵逻辑回归模型 梯度下降逻辑回归模型求解编程求解sklearn 实现&#xff0c;并查看拟合指标 逻辑回归 逻辑回归是一种广义线性模型&#xff0c;形式上引入了 S i g m o i d Sigmoid Sigmoid 函数…

Windows10中在Visual Studio2017中VC++项目安装使用GoogleTest库

Windows10中在Visual Studio2017中VC项目安装使用GoogleTest库 在Windows10中VC程序中可以不用自己手动下载GoogleTest源代码&#xff0c;可以直接通过【项目】-> 【管理 NuGet 程序包】-> 【浏览】-> 搜索 googletest&#xff0c; 找到Microsoft.googletest.v140.wi…

物联网实训室虚拟仿真软件建设方案

一、概述 物联网实训室虚拟仿真软件旨在紧密围绕立德树人的根本任务&#xff0c;充分依托先进的数字技术&#xff0c;并对接物联网行业的发展趋势和人才需求。通过对比真实企业工作环境&#xff0c;融合创新创业教育基因&#xff0c;秉承虚拟仿真技术与教育教学深度融合的理念&…

流批一体历史背景及基础介绍

目录 一、历史背景1.BI系统2.传统大数据架构3.流式架构4.Lambda架构5.Kappa架构 二、流批一体与数据架构的关系数据分析型应用数据管道型应用 三、流与批的桥梁Dataflow模型四、Dataflow模型的本质一个基本点两个时间域三个子模型1.窗口模型2.触发器模型3. 增量计算模型 四个分…

Netty Review - 探索Pipeline的Inbound和Outbound

文章目录 概念Server CodeClient CodeInboundHandler和OutboundHandler的执行顺序在InboundHandler中不触发fire方法InboundHandler和OutboundHandler的执行顺序如果把OutboundHandler放在InboundHandler的后面&#xff0c;OutboundHandler会执行吗 概念 我们知道当boss线程监控…

自学MySql(一)

1.安装下载 下载网址 2、将mysql的bin目录添加到环境变量&#xff08;可选&#xff09; 3、使用一下命令测试

GAN:WGAN前作

WGAN前作&#xff1a;有原则的方法来训练GANs 论文&#xff1a;https://arxiv.org/abs/1701.04862 发表&#xff1a;ICLR 2017 本文是wgan三部曲的第一部。文中并没有引入新的算法&#xff0c;而是标是朝着完全理解生成对抗网络的训练动态过程迈进理论性的一步。 文中基本是…

文心一言 VS 讯飞星火 VS chatgpt (146)-- 算法导论12.2 1题

一、用go语言&#xff0c;假设一棵二叉搜索树中的结点在1到 1000 之间&#xff0c;现在想要查找数值为 363 的结点。下面序列中哪个不是查找过的序列? a.2&#xff0c;252&#xff0c;401&#xff0c;398&#xff0c;330&#xff0c;344&#xff0c;397&#xff0c;363。 b.9…

ps 透明印章制作

ps 透明印章制作 1、打开不透明印章2、抠出红色印章3、新建图层4、填充红色印章到新图层5、导出透明印章 1、打开不透明印章 打开ps软件&#xff0c;菜单栏选择 文件-打开 选择本地不透明印章 打开 2、抠出红色印章 ps菜单栏 选择 选择-色彩范围 点击色彩范围 色彩范围窗口 取…

内网协议区别

今天面试的时候被面试官问到内网隧道技术中的协议有什么区别&#xff0c;平时只注重使用不注重原理&#xff0c;学习记录 2023-11-30 网络层&#xff1a;IPV6 隧道、ICMP 隧道、GRE 隧道 传输层&#xff1a;TCP 隧道、UDP 隧道、常规端口转发 应用层&#xff1a;SSH 隧道、HTTP…

基于B/S架构的医院一体化电子病历编辑器源码

电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;通过一体化的设计&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心&#xff0c;以临床诊疗信息为主线…

使用 SDKMAN 管理多版本本地 Java 环境---Centos8 Windows

文章目录 windows 安装centos8 安装卸载sdkman使用 windows 安装 SDKMAN是一个 jdk 多版本管理工具&#xff0c;类似于 nodejs 中的 nvm。可以在本地存在多个 java 环境&#xff0c;快速切换功能&#xff0c;同时&#xff0c;他不止于 java sdk&#xff0c;还有maven、tomcat等…