Windows 与 Presenters

Windows 与 Presenters Windows 与 PresentersSource/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;}publicFuncTaskboolCanSumit{get;set;}publicvoidSumit(){this.DialogResulttrue;this.Close();}}按钮类型publicenumDialogButton{None,// 无按钮Sumit,// 仅确定Cancel,// 仅取消SumitAndCancel// 确定和取消}使用示例// 方式一直接显示 Presenterbool?resultDialogWindow.ShowPresenter(myPresenter);// 方式二带回调的显示bool?resultDialogWindow.ShowPresenter(myPresenter,action:dialog{dialog.Title自定义标题;dialog.Width500;},canSumit:async(){// 验证逻辑returnawaitValidateData();});2.4 Ribbon 窗口Ribbon 窗口适合 Office 风格应用ribbon:RibbonWindowx:ClassMyApp.MainWindowGrid!-- Ribbon 区域 --ribbon:Ribbonribbon: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 常用 PresenterPresenter功能说明DataGridPresenter数据表格展示自动绑定数据源ListBoxPresenter列表展示支持多选、搜索TreeViewPresenter树形结构展示支持层级数据ImageViewPresenter图片查看支持缩放、旋转WaitPresenter等待提示加载状态显示TextBoxPresenter文本输入带验证的输入框MessagePresenter消息展示消息提示框3.4 DataGridPresenter 使用示例// 方式一使用消息服务显示awaitIocMessage.Dialog.ShowDataGrid(presenter{presenter.ItemsSourcemyDataList;});// 方式二使用命令ShowDataGridCommandcommandnewShowDataGridCommand{ItemsSourcemyDataList};command.Execute(null);// 方式三XAML 绑定ButtonCommand{local:ShowDataGridCommand ItemsSource{Binding MyData}}/3.5 创建自定义 Presenter步骤1创建 Presenter 类[Icon(\xE890)][Display(Name用户列表)]publicclassUserListPresenter:BindableBase{privateObservableCollectionUser_users;publicObservableCollectionUserUsers{get_users;set{_usersvalue;RaisePropertyChanged();}}privateUser_selectedUser;publicUserSelectedUser{get_selectedUser;set{_selectedUservalue;RaisePropertyChanged();}}publicICommandEditCommand{get;}publicICommandDeleteCommand{get;}publicUserListPresenter(){EditCommandnewRelayCommand(OnEdit);DeleteCommandnewRelayCommand(OnDelete);}privatevoidOnEdit(objectparameter){// 编辑逻辑}privatevoidOnDelete(objectparameter){// 删除逻辑}}步骤2创建 XAML 模板UserControlx:ClassMyApp.UserListPresenterGridDataGridItemsSource{Binding Users}SelectedItem{Binding SelectedUser}AutoGenerateColumnsTrue/StackPanelOrientationHorizontalHorizontalAlignmentRightButtonCommand{Binding EditCommand}Content编辑/ButtonCommand{Binding DeleteCommand}Content删除//StackPanel/Grid/UserControl步骤3使用 Presenter// 显示在对话框中awaitIocMessage.Dialog.ShowDialogUserListPresenter(presenter{presenter.UsersuserService.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 案例一数据选择对话框// 创建并显示数据选择对话框publicasyncTaskUserSelectUserAsync(){UserselectedUsernull;awaitIocMessage.Dialog.ShowDialogUserListPresenter(presenter{presenter.Users_userService.GetUsers();},presenter{// 确定按钮回调selectedUserpresenter.SelectedUser;});returnselectedUser;}5.2 案例二等待提示// 显示等待提示using(varwaitPresenternewWaitPresenter{Message加载中...}){awaitIocMessage.Dialog.ShowDialog(waitPresenter,action:null);// 在后台执行耗时操作awaitTask.Run((){// 耗时操作});}5.3 案例三表单编辑// 编辑用户信息publicasyncTaskboolEditUserAsync(Useruser){returnawaitIocMessage.Dialog.ShowDialogUserEditPresenter(presenter{presenter.Useruser;},presenter{// 保存逻辑_userService.Update(presenter.User);});}六、最佳实践6.1 Presenter 设计原则// ✅ 推荐继承 BindableBasepublicclassMyPresenter:BindableBase{}// ✅ 推荐使用 Display 特性[Display(Name用户列表,Description管理用户信息)]publicclassUserListPresenter{}// ✅ 推荐使用 Icon 特性[Icon(\xE890)]publicclassUserListPresenter{}6.2 窗口显示方式// ✅ 推荐使用消息服务awaitIocMessage.Dialog.ShowDialogMyPresenter();// ✅ 推荐使用静态方法DialogWindow.ShowPresenterMyPresenter();// ✅ 推荐使用命令ButtonCommand{local:ShowMyPresenterCommand}/6.3 数据传递模式// ✅ 推荐通过回调传递数据awaitIocMessage.Dialog.ShowDialogMyPresenter(option:pp.DatainitialData,sumitAction:presultp.Data);七、总结Windows 和 Presenters 构成了 WPF-Control 的界面展示层Windows提供窗口容器主窗口、对话框、Ribbon 窗口等Presenters封装业务页面数据展示、表单编辑、消息提示等协作模式Window 承载 PresenterPresenter 使用 Controls这种分层设计使得复用性Presenter 可在不同窗口中复用可测试性Presenter 易于单元测试可维护性业务逻辑集中在 Presenter 中掌握这套体系可以快速构建专业的 WPF 应用界面。