当前位置: 首页 > news >正文

在 VS2022 中创建 Presenter 文件对

在 VS2022 中创建 Presenter 文件对

一、ImagePresenter 的本质

ImagePresenter.xaml实际上是一个ResourceDictionary(资源字典),用于定义 DataTemplate,而不是标准的 UserControl 或 Window。

ImagePresenter.xaml → ResourceDictionary(定义 DataTemplate) ImagePresenter.xaml.cs → 对应的代码后台类(定义 ImagePresenter 类)

二、创建方法

方法一:创建 ResourceDictionary + Class(推荐)

步骤 1:创建 XAML 文件

  1. 在 VS2022 中右键点击Presenter文件夹
  2. 选择添加 → 新建项
  3. 搜索 “Resource Dictionary”
  4. 命名为ImagePresenter.xaml
  5. 点击添加

步骤 2:创建对应的 CS 文件

  1. 右键点击Presenter文件夹
  2. 选择添加 → 新建项
  3. 搜索 “Class”
  4. 命名为ImagePresenter.xaml.cs
  5. 点击添加

方法二:手动创建(最简单)

直接在同一目录下创建两个文件:

Presenter/ ├── ImagePresenter.xaml ← ResourceDictionary └── ImagePresenter.xaml.cs ← Class

ImagePresenter.xaml 内容:

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:H.App.LabelImg"><!-- 在这里定义 DataTemplate --><DataTemplateDataType="{x:Type local:ImagePresenter}"><Grid><!-- 你的 UI 内容 --></Grid></DataTemplate></ResourceDictionary>

ImagePresenter.xaml.cs 内容:

usingSystem;usingSystem.Collections.ObjectModel;usingH.Mvvm.ViewModels.Base;usingH.App.LabelImg.Provider;namespaceH.App.LabelImg;publicclassImagePresenter:ModelBindable<ImageBindable>{publicImagePresenter(ImageBindablet):base(t){}// 添加你的属性和命令}

三、快速复制现有文件作为模板

如果你已经有类似的 Presenter 文件(如LabelManagerPresenter.xaml),可以:

  1. 复制LabelManagerPresenter.xaml→ 重命名为ImagePresenter.xaml
  2. 复制LabelManagerPresenter.xaml.cs→ 重命名为ImagePresenter.xaml.cs
  3. 修改文件内容

四、ImagePresenter 完整代码参考

根据你之前打开的文件,以下是完整的 ImagePresenter:

ImagePresenter.xaml.cs

usingH.App.LabelImg.Provider;usingH.Extensions.Common;usingH.LabelImg.ShapeBox.Shapes.Base;usingH.LabelImg.ShapeBox.State;usingH.LabelImg.ShapeBox.State.Adds.Base;usingH.LabelImg.ShapeBox.State.Base;usingH.Mvvm.Commands;usingH.Mvvm.ViewModels.Base;usingSystem.Linq;namespaceH.App.LabelImg;publicclassImagePresenter:ModelBindable<ImageBindable>,IShapes{publicImagePresenter(ImageBindablet):base(t){this.RefreshViewStates();}privateObservableCollection<IViewState>_ViewStates=newObservableCollection<IViewState>();[JsonIgnore]publicObservableCollection<IViewState>ViewStates{get{return_ViewStates;}set{_ViewStates=value;RaisePropertyChanged();}}privateIViewState_viewState;[JsonIgnore]publicIViewStateViewState{get{return_viewState;}set{_viewState=value;RaisePropertyChanged();}}IReadOnlyCollection<IShape>IShapes.Shapes{get=>this.Model.Shapes;}protectedvirtualIEnumerable<IViewState>CreateViewStates(){if(IocProject.Instance.CurrentisFileProjectItemprojectItem){foreach(variteminprojectItem.Labels){varb=newSolidColorBrush(item.LabelColor);b.Freeze();yieldreturnnewAddLabelShapesState(this,()=>this.Model.CreateShape(x=>{x.Title=item.LabelName;x.Stroke=b;}));}}}publicvoidRefreshViewStates(){this.ViewStates=this.CreateViewStates().ToObservable();this.ViewState=this.ViewStates.FirstOrDefault();}publicvoidAddShapes(paramsIShape[]shapes){this.Model.AddShapes(shapes.OfType<LabelRectShape>().ToArray());}publicvoidDeleteShapes(paramsIShape[]shapes){this.Model.DeleteShapes(shapes);}publicRelayCommandAddLabelCommand=>newRelayCommand(asyncx=>{LabelItemlabelItem=newLabelItem();varr=awaitIocMessage.Form.ShowEdit(labelItem,x=>x.Title="新增标签");if(r!=true)return;if(IocProject.Instance.CurrentisFileProjectItemprojectItem){projectItem.Labels.Add(labelItem);projectItem.Save(outstringmessage);projectItem.RefreshLabelFilters();this.RefreshViewStates();}});publicRelayCommandShowLabelManagerCommand=>newRelayCommand(asyncx=>{LabelManagerPresenterpresenter=newLabelManagerPresenter();varr=awaitIocMessage.Dialog.Show(presenter);if(r!=true)return;if(IocProject.Instance.CurrentisFileProjectItemprojectItem){projectItem.Labels=presenter.Collection;projectItem.Save(outstringmessage);projectItem.RefreshLabelFilters();this.RefreshViewStates();}});publicRelayCommandClearCommand=>newRelayCommand(x=>{this.Model.Clear();});}publicclassImageThumbPresenter:ModelBindable<ImageBindable>{publicImageThumbPresenter(ImageBindablet):base(t){}}

五、注意事项

命名空间匹配

确保ImagePresenter.xaml.cs中的命名空间与ImagePresenter.xaml中的xmlns:local匹配:

<!-- ImagePresenter.xaml -->xmlns:local="clr-namespace:H.App.LabelImg"
// ImagePresenter.xaml.csnamespaceH.App.LabelImg;

继承类正确

确保ImagePresenter继承自正确的基类:

publicclassImagePresenter:ModelBindable<ImageBindable>,IShapes

using 指令

确保添加必要的 using 指令:

  • H.Mvvm.ViewModels.Base(ModelBindable)
  • H.Mvvm.Commands(RelayCommand)
  • H.LabelImg.*(ShapeBox 相关)
http://www.jsqmd.com/news/911203/

相关文章:

  • 3种Janus-7B应用场景:从客服助手到个性化内容创作
  • Simple Live终极指南:一站式跨平台直播聚合解决方案,5分钟搭建专属直播中心
  • GA/T 1400协议实战:用Java和RestTemplate搞定通知消息推送(附完整代码)
  • 医药冷链运输的温湿度监控能做到无人值守吗?企业级Agent如何重塑效率
  • 深入解析LibreHardwareMonitor:开源硬件监控解决方案的核心架构与实践应用
  • 免费写标书软件推荐:一个功能永久免费的标书AI,值不值得试? - 陈工0237
  • 2026上海黄金回收TOP5靠谱商家(实测推荐)上海捷当黄金领跑黄金回收靠谱榜单 - 资讯快报
  • BERT-large-uncased训练数据揭秘:BookCorpus+Wikipedia的11亿词元预训练
  • 2026年前端开发完全指南:AI辅助写组件、调Bug、生成接口代码,效率翻倍
  • 开源矢量网络分析仪LibreVNA:从6GHz射频测量到专业级信号分析的完整指南
  • Gemma-4-31B-it-assistant:Google开源多模态AI助手完全指南
  • 企业矩阵系统建设实践:从账号管理到AI内容协同
  • 2026徐州黄金回收甄选TOP4:仅这几家满足零投诉无隐形扣费 - 生活测评君
  • 微信聊天记录永久保存终极指南:如何让每一段对话都成为永恒记忆
  • 深度解析:洛雪音乐音源架构的技术实现与性能优化
  • 基于Raspberry Pi Pico与MicroPython的嵌入式记忆游戏开发实战
  • 2026年沈阳地坪市场扫描:水性聚氨酯砂浆厂家多维实力梳理 - 兔兔不是荼荼
  • 从BIOS到ACPI:聊聊操作系统电源管理这二十年的‘幕后英雄’
  • h2o-danube-1.8b-sft 对比分析:与同类18亿参数模型的性能评测
  • 泰国DAB法规 学习英语~
  • NPU加速实战:Llama3-ChatQA-1.5-8B在国产硬件上的部署与性能优化指南
  • 2026年前端框架选型指南:React、Vue、Angular怎么选?AI辅助开发全流程演示
  • 2026年6月租房不收中介费指南,房东直租app省心租房攻略 - 资讯速览
  • 从Modbus到XMODEM:一文搞懂CRC-16不同变体的区别与C语言实战
  • 跨平台资源下载神器:3分钟快速掌握res-downloader完整教程
  • 2026苏州闲置黄金处置科普 | 选对门店避开回收各类套路 - 奢侈品回收测评
  • 原神FPS解锁器终极指南:三步实现高帧率游戏体验
  • 平台认证 + 实绩核验 拼多多代运营优质服务商推荐 - 品牌榜中榜
  • 告别视频下载烦恼:N_m3u8DL-CLI-SimpleG让你的在线视频保存变得如此简单
  • FPGA设计思想与验证方法学系列学习笔记001