news 2026/5/28 23:59:27

Windows 与 Presenters

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows 与 Presenters

Windows 与 Presenters

Source/Windows

项目功能
H.Windows.Main主窗口、窗口命令、窗口设置保存。
H.Windows.Dialog对话窗口。
H.Windows.DockDock 窗口。
H.Windows.RibbonRibbon 窗口和 Ribbon 样式。

H.Windows.Ribbon包含 RibbonButton、RibbonTab、RibbonGroup、RibbonGallery、RibbonWindow 等,适合 Office 风格应用。

Source/Presenters

项目功能
H.Presenters.Common通用展示器。
H.Presenters.Repository仓储数据展示器。
H.Presenters.Design设计器展示器。

Presenter 可以理解为“业务化控件”:控件偏通用,Presenter 偏业务页面。


Windows 与 Presenters 窗口展示器详解

一、概述

在 WPF-Control 框架中,Windows负责窗口级别的容器管理,而Presenters则是"业务化控件"——介于通用控件和完整页面之间的中间层。

核心区别:控件偏通用,Presenter 偏业务页面。

二、Windows 窗口系统

2.1 窗口项目结构

Source/Windows/ ├── H.Windows.Main/ # 主窗口 ├── H.Windows.Dialog/ # 对话框窗口 ├── H.Windows.Dock/ # Dock 停靠窗口 └── H.Windows.Ribbon/ # Ribbon 窗口(Office风格)

2.2 窗口类型对比

窗口类型功能特点适用场景
Main主窗口,支持设置保存、命令绑定应用主界面
Dialog模态对话框,支持动画过渡确认框、输入框
Dock可停靠布局窗口工具面板、属性面板
RibbonOffice风格带状界面专业办公软件

2.3 DialogWindow 详解

核心功能
publicpartialclassDialogWindow:Window,IDialog{publicDialogButtonDialogButton{get;set;}=DialogButton.Sumit;publicboolUseDropShadowEffect{get;set;}publicFunc<Task<bool>>CanSumit{get;set;}publicvoidSumit(){this.DialogResult=true;this.Close();}}
按钮类型
publicenumDialogButton{None,// 无按钮Sumit,// 仅确定Cancel,// 仅取消SumitAndCancel// 确定和取消}
使用示例
// 方式一:直接显示 Presenterbool?result=DialogWindow.ShowPresenter(myPresenter);// 方式二:带回调的显示bool?result=DialogWindow.ShowPresenter(myPresenter,action:dialog=>{dialog.Title="自定义标题";dialog.Width=500;},canSumit:async()=>{// 验证逻辑returnawaitValidateData();});

2.4 Ribbon 窗口

Ribbon 窗口适合 Office 风格应用:

<ribbon:RibbonWindowx:Class="MyApp.MainWindow"><Grid><!-- Ribbon 区域 --><ribbon:Ribbon><ribbon:RibbonTabHeader="主页"><ribbon:RibbonGroupHeader="剪贴板"><ribbon:RibbonButtonLabel="复制"LargeImageSource="..."/><ribbon:RibbonButtonLabel="粘贴"LargeImageSource="..."/></ribbon:RibbonGroup></ribbon:RibbonTab></ribbon:Ribbon><!-- 内容区域 --><ContentControl/></Grid></ribbon:RibbonWindow>

三、Presenters 展示器系统

3.1 Presenter 的概念

Presenter是"业务化控件",它将:

  • 控件(如 DataGrid、ListBox)
  • 数据绑定
  • 业务逻辑

封装成可复用的单元。

3.2 Presenter 项目结构

Source/Presenters/ ├── H.Presenters.Common/ # 通用展示器 │ ├── DataGridPresenter # 数据表格展示器 │ ├── ListBoxPresenter # 列表展示器 │ ├── TreeViewPresenter # 树形展示器 │ ├── ImageViewPresenter # 图片查看器 │ └── WaitPresenter # 等待提示器 ├── H.Presenters.Repository/ # 仓储数据展示器 └── H.Presenters.Design/ # 设计器展示器

3.3 常用 Presenter

Presenter功能说明
DataGridPresenter数据表格展示自动绑定数据源
ListBoxPresenter列表展示支持多选、搜索
TreeViewPresenter树形结构展示支持层级数据
ImageViewPresenter图片查看支持缩放、旋转
WaitPresenter等待提示加载状态显示
TextBoxPresenter文本输入带验证的输入框
MessagePresenter消息展示消息提示框

3.4 DataGridPresenter 使用示例

// 方式一:使用消息服务显示awaitIocMessage.Dialog.ShowDataGrid(presenter=>{presenter.ItemsSource=myDataList;});// 方式二:使用命令ShowDataGridCommandcommand=newShowDataGridCommand{ItemsSource=myDataList};command.Execute(null);// 方式三:XAML 绑定<ButtonCommand="{local:ShowDataGridCommand ItemsSource={Binding MyData}}"/>

3.5 创建自定义 Presenter

步骤1:创建 Presenter 类

[Icon("\xE890")][Display(Name="用户列表")]publicclassUserListPresenter:BindableBase{privateObservableCollection<User>_users;publicObservableCollection<User>Users{get=>_users;set{_users=value;RaisePropertyChanged();}}privateUser_selectedUser;publicUserSelectedUser{get=>_selectedUser;set{_selectedUser=value;RaisePropertyChanged();}}publicICommandEditCommand{get;}publicICommandDeleteCommand{get;}publicUserListPresenter(){EditCommand=newRelayCommand(OnEdit);DeleteCommand=newRelayCommand(OnDelete);}privatevoidOnEdit(objectparameter){// 编辑逻辑}privatevoidOnDelete(objectparameter){// 删除逻辑}}

步骤2:创建 XAML 模板

<UserControlx:Class="MyApp.UserListPresenter"><Grid><DataGridItemsSource="{Binding Users}"SelectedItem="{Binding SelectedUser}"AutoGenerateColumns="True"/><StackPanelOrientation="Horizontal"HorizontalAlignment="Right"><ButtonCommand="{Binding EditCommand}"Content="编辑"/><ButtonCommand="{Binding DeleteCommand}"Content="删除"/></StackPanel></Grid></UserControl>

步骤3:使用 Presenter

// 显示在对话框中awaitIocMessage.Dialog.ShowDialog<UserListPresenter>(presenter=>{presenter.Users=userService.GetUsers();});

四、Windows 与 Presenters 的协作

4.1 架构关系

┌─────────────────────────────────────────────────────────────┐ │ Windows │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ MainWindow │ │ DialogWindow│ │ RibbonWindow│ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ ├─────────────────────────────────────────────────────────────┤ │ Presenters │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │DataGridPresenter│ListBoxPresenter│TreeViewPresenter│ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ ├─────────────────────────────────────────────────────────────┤ │ Controls │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ DataGrid │ │ ListBox │ │ TreeView │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────────┘

4.2 调用流程

1. 用户触发操作 │ ▼ 2. 调用 DialogWindow.ShowPresenter() │ ▼ 3. 创建 DialogWindow 实例 │ ▼ 4. 设置 Presenter 为 Content │ ▼ 5. 显示对话框 │ ▼ 6. 用户操作 Presenter 中的控件 │ ▼ 7. Presenter 的 Command/ViewModel 响应 │ ▼ 8. 点击确定/取消关闭对话框

五、实际应用案例

5.1 案例一:数据选择对话框

// 创建并显示数据选择对话框publicasyncTask<User>SelectUserAsync(){UserselectedUser=null;awaitIocMessage.Dialog.ShowDialog<UserListPresenter>(presenter=>{presenter.Users=_userService.GetUsers();},presenter=>{// 确定按钮回调selectedUser=presenter.SelectedUser;});returnselectedUser;}

5.2 案例二:等待提示

// 显示等待提示using(varwaitPresenter=newWaitPresenter{Message="加载中..."}){awaitIocMessage.Dialog.ShowDialog(waitPresenter,action:null);// 在后台执行耗时操作awaitTask.Run(()=>{// 耗时操作});}

5.3 案例三:表单编辑

// 编辑用户信息publicasyncTask<bool>EditUserAsync(Useruser){returnawaitIocMessage.Dialog.ShowDialog<UserEditPresenter>(presenter=>{presenter.User=user;},presenter=>{// 保存逻辑_userService.Update(presenter.User);});}

六、最佳实践

6.1 Presenter 设计原则

// ✅ 推荐:继承 BindableBasepublicclassMyPresenter:BindableBase{}// ✅ 推荐:使用 Display 特性[Display(Name="用户列表",Description="管理用户信息")]publicclassUserListPresenter{}// ✅ 推荐:使用 Icon 特性[Icon("\xE890")]publicclassUserListPresenter{}

6.2 窗口显示方式

// ✅ 推荐:使用消息服务awaitIocMessage.Dialog.ShowDialog<MyPresenter>();// ✅ 推荐:使用静态方法DialogWindow.ShowPresenter<MyPresenter>();// ✅ 推荐:使用命令<ButtonCommand="{local:ShowMyPresenterCommand}"/>

6.3 数据传递模式

// ✅ 推荐:通过回调传递数据awaitIocMessage.Dialog.ShowDialog<MyPresenter>(option:p=>p.Data=initialData,sumitAction:p=>result=p.Data);

七、总结

Windows 和 Presenters 构成了 WPF-Control 的界面展示层

  1. Windows提供窗口容器:主窗口、对话框、Ribbon 窗口等
  2. Presenters封装业务页面:数据展示、表单编辑、消息提示等
  3. 协作模式:Window 承载 Presenter,Presenter 使用 Controls

这种分层设计使得:

  • 复用性:Presenter 可在不同窗口中复用
  • 可测试性:Presenter 易于单元测试
  • 可维护性:业务逻辑集中在 Presenter 中

掌握这套体系,可以快速构建专业的 WPF 应用界面。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 23:58:40

D2019UK,高增益单端式硅DMOS RF FET射频晶体管

简介今天我要向大家介绍的是 Semelab 的硅DMOS RF FET晶体管——D2019UK。这是一款专为HF/VHF/UHF通信频段&#xff08;从1MHz至2 GHz&#xff09;设计的单端式射频功率场效应管&#xff0c;在28V工作电压、1GHz频率下可提供2.5W的输出功率。作为一款高性能射频器件&#xff0c…

作者头像 李华
网站建设 2026/5/21 20:48:32

PKPM结构设计许可不够用?自动释放闲置,建筑结构师福音

你是不是也遇到过设计院里工程师排队等许可证的尴尬&#xff1f;2026年我们团队就因为30%的闲置许可&#xff0c;把项目阻断了整整两周。当时我盯着监控屏上跳动的"许可证已超限"红字&#xff0c;真想把键盘砸了。为什么许可释放总不及时我见过太多人搞不明白这个机制…

作者头像 李华
网站建设 2026/5/21 20:47:05

用 ai 生成带货/电商短视频,有哪些工具比较好用?下面推荐几个

在 2026 年&#xff0c;短视频内容已成为驱动电商转化的核心引擎。然而&#xff0c;许多商家仍面临本土化适配难、制作周期长、精品成本高等痛点。本文将针对“怎么用 ai 生成带货视频&#xff0c;有哪些工具比较好用&#xff1f;”以及“AI 生成电商短视频的工具有哪些&#x…

作者头像 李华
网站建设 2026/5/21 20:45:21

工业三防灯干货科普:核心参数、选型逻辑及应用场景全解析

在工业照明领域&#xff0c;三防灯是适配恶劣环境的核心照明设备&#xff0c;广泛应用于车间、仓库、隧道、冷链、食品加工等多场景。不同于民用照明灯具&#xff0c;工业级三防灯需具备防尘、防水、防腐蚀的核心能力&#xff0c;其性能直接决定照明稳定性、使用寿命及后期运维…

作者头像 李华
网站建设 2026/5/21 20:41:50

对比直接使用官方 API,通过 Taotoken 调用在成本透明度上的提升体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用官方 API&#xff0c;通过 Taotoken 调用在成本透明度上的提升体验 作为个人开发者&#xff0c;在集成大模型能力到项…

作者头像 李华