利用午休时间继续把过去写的一些代码翻出来说一说,文章可能写的比较简略,但是我会努力把核心意思表达清楚,具体代码可直接访问 Github 获取。

Github 地址:https://github.com/iccb1013/Sheng.Winform.Controls.Controller

这些代码是针对 WinForm 写的,但稍加改动即可应用于 WPF 开发中。

提到控制器,我们可能会首先想到流行的 MVC 开发中的控制器 Controller。对于 MVC 开发来说,我们把工程结构划分为 模型、视图、控制器。这是比较宏观的工程角度的划分,那么对于一些小范围的,更具体的编码问题,这样的模式是否能够借鉴呢?答案是肯定的。

在我们的客户端应用程序开发中,可能会涉及大量的控件操作的代码,如 TreeView,DataGridView,ListBox 等等,这些控件虽然都提供了基本的数据操作接口,但是这些接口的功能都非常的基础和简单,考虑如下操作:

  • 在控件中使指定的数据处于选中状态;
  • 在控件中删除符合条件的数据;
  • 向控件中的指定位置添加数据,并判断数据的类型是否符合预期;
  • 在控件中查找符合条件的数据;
  • 获取控件中选中的数据,直接返回强类型结果;
  • 移动指定的数据到另一个数据项目之前/之后;
  • 展开树控件中符合条件的树节点;

这些操作有一个重要的共同点,都是针对“数据”进行操作,但是基本的的控件接口,没有这么多功能,既有的接口也多是以 object 作为参数来操作的,如果要实现这些功能,很多时候程序员需要写一些“业务代码”来完成,在业务代码中迭代数据源,写条件判断,做类型转换,最后调用控件的基本操作接口。

通常代码看起来如下图这样:

那么这些共通的功能,是否能够抽象出来呢?答案是肯定的,于是我们可以考虑继承这些控件,来添加我们想要的功能:

我们把这些共通的操作,实现在继承的控件中,然后在项目中使用自己实现的控件,这不失为一个办法,但是通过继承来实现这样的功能,有很大的缺陷:

  • 必须在项目中所有使用控件的地方,使用继承而来的控件,对于全新开发的项目尚可考虑,但是对于中后期的项目,再去修改这些控件代价与风险过高;
  • 有些项目本身使用了第三方控件,那么你针对原生控件的继承的实现就无法使用,必须针对第三方控件再做一次继承和实现;
  • 有时我们会需要某些特定的操作,只在某些情况下使用,如果全部写在继承的控件中,代码可能会冗余和过大,如果在继承的基础上再继承一次,结构过于繁杂;

这里要引出一句话:对象的复合优于对象的继承。

我们使用复合不同的对象(控件和控制器)的方法,来解决这个问题:

我们可以为不同的控件,实现它们对应的“控制器”,然后在控制器中,实现我们的这些方法,这样做可以最大程度的获得灵活性与可控性,我们直接使用原生(或第三方控件)来开发项目,然后在代码中,为控件初始化一个控制器,接下来使用控制器来操作控件,对于上文提到的除了共通的操作外,还需要某些特定的操作的情况,可以实现为不同的控制器进行操作。

看一个控制器实现的代码示例,这是一个支持通过类型(Type)来呈现和操作数据的 DataGirdView 的控制器:

使用构造函数接收一个原生的 DataGridView 控件实例来包装它,及时是第三方控件,只要它是继承自 DataGridView 的,就可以直接使用。

接下来就可以直接使用控制器中的诸多方法,来操作控件,实现我们上文中提到的诸多功能。

代码的具体实现其实并不复杂,并且代码写于很多年前,有些细节的实现现在看来也并非最佳,只为抛砖引玉,轻拍。

具体的代码实现可以访问我的 Github 获取,包括:

  • DataGridViewController
  • TabControlController
  • TreeViewController
  • ListBoxController

你可以直接使用这些代码,也可以参考这些代码和本文所提出的思路,实现更多的控件控制器。

Q:279060597  @南京

http://sheng.city/post/github-winform-wpf-sheng-winform-controls-controller

Github 开源:使用控制器操作 WinForm/WPF 控件( Sheng.Winform.Controls.Controller)的更多相关文章

  1. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  2. WPF控件--利用Winform库中的NotifyIcon实现托盘小程序

    WPF控件--NotifyIcon   运行界面如下所示:            图1                                             图2 代码很少,如下所示 ...

  3. 《Dotnet9》系列-开源C# WPF控件库2《Panuon.UI.Silver》强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  4. 解决 CefSharp WPF控件不能使用输入法输入中文的问题(代码已提交到 github)

    首先,本文所有 代码已经提交到github,需要的可以直接从github获取:https://github.com/starts2000/CefSharp,希望可以帮助到有需要的朋友们. CEF 简介 ...

  5. 国内开源C# WPF控件库Panuon.UI.Silver推荐

    国内优秀的WPF开源控件库,Panuon.UI的优化版本.一个漂亮的.使用样式与附加属性的WPF UI控件库,值得向大家推荐使用与学习. 今天站长(Dotnet9,站长网址:https://dotne ...

  6. 国内开源C# WPF控件库Panuon.UI.Silver强力推荐

    国内优秀的WPF开源控件库,Panuon.UI的优化版本.一个漂亮的.使用样式与附加属性的WPF UI控件库,值得向大家推荐使用与学习. 今天站长(Dotnet9,站长网址:https://dotne ...

  7. 《Dotnet9》系列-开源C# WPF控件库3《HandyControl》强力推荐

    大家好,我是Dotnet9小编,一个从事dotnet开发8年+的程序员.我最近开始写dotnet分享文章,希望能让更多人看到dotnet的发展,了解更多dotnet技术,帮助dotnet程序员应用do ...

  8. 《Dotnet9》系列-开源C# WPF控件库1《MaterialDesignInXAML》强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  9. 《Dotnet9》系列-开源C# WPF控件库强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

随机推荐

  1. JSP/Servlet------------------------->>动态网页开发基础(一)

    动态网页:是指在服务器端运行的,使用程序语言设计的交互式网页,它们会根据某种条件的变化,返回不同的网页内容. 动态网站可以实现交互功能,如用户注册.信息发布.产品展示.订单管理等等: 动态网页并不是独 ...

  2. 使用HTTP的同步方式还是异步方式?

    同步与异步 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完 ...

  3. 倒排索引的AND操作

    这是一道来自百度的面试题.倒排索引的AND操作. 倒排索引是以关键词作为索引项来索引文档的一种机制,如图中Brutus.Calpurnia.Caesar为关键词,2.4.8等等为文档ID. 现在有一个 ...

  4. (一)一起学 Java Collections Framework 源码之 概述

    . . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述 JDK 中很多类 LZ 已经使用了无数次,但认认真真从源码级研究过其原理的还只占少数,虽然从 ...

  5. python-day 练习1

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''需求: a. 元素分类 有如下值集合 v1 = [11,22,33,44,55,66,77,88,99,90 ...

  6. 基于ZKWeb + Angular 4.0的开源管理后台Demo

    这是一套基于ZKWeb网页框架和Angular 4.0编写的开源管理后台Demo,实现了前后端分离和模块化开发, 地址是: https://github.com/zkweb-framework/ZKW ...

  7. 电商的噩梦?实体商家的福音——VR全景智慧城市

    我们不知道未来网络购物的样子,但对当前电商平台的问题是清楚的.从消费者角度来看,网购的顾虑主要在于商品的质量难以保证.物流效率不够高,以及网络购物的"眼见不为实". 正因为可以很好 ...

  8. 全景智慧城市——NOW!!!VRSHOPPING颠覆你的购物认知!

    互联网+时代,人们对现有的网络资源已经不再感冒,一般的图片.文字信息已经无法满足人们对互联网的需求,虚拟现实.身临其境的体验是不可小觑的发展趋势,尤其是VR逛街.购物,更会深入人心,再次改变人们的生活 ...

  9. vim - manual -个人笔记

    ##vim配置 ###normal > 输入命令:w 写入保存 > > 粘贴 :p(向下粘贴) P(大写向上粘贴) > > 复制 :yy 复制一行 > > 删 ...

  10. 【JAVAWEB学习笔记】14_response

    HttpServletResponse 学习目标 案例一.完成文件下载 案例二.生成验证码(了解) 1.HttpServletResponse概述 我们在创建Servlet时会覆盖service()方 ...