微软winform控件中没有侧边导航栏,但这种导航栏在很多类型的项目中都需要,一些收费第三方控件库有相应的实现控件,如DotNetBar2,重点是收费,样式也老套。
如何实现自己的导航栏呢?
如何让自己的导航栏支持在设计时的编辑和事件响应呢?
实现自定义导航栏
前置条件:GDI+
- 新增加一个自定义类从TreeView继承
- 处理TreeView的DrawNode事件,这里是关键,可以判断是哪一级节点,然后绘制不同的样式
- 根据节点级别,综合焦点、展开与否等条件绘制节点。绘制就是DrawString等。
- 处理NodeMouseClick事件,控制节点的展开及收起。
https://github.com/wuqinchao/JwControls/blob/master/Jw.Winform.Ctrls/JwNavBar/JwNavBar.cs
在设计时设置节点
- 新增加一个自定义设计器类,从ControlDesigner继承
- 在设计器类中增加我们自己的DesignerVerb,需要取个名称,对应一个点击事件处理方法
- 在DesignerVerb的事件处理方法中,我们可以通过this.Control获取到当前的TreeView, 也就可以拿到所有节点了。将节点交给下一步的对话框,处理完成后更新节点。
- 新建一个对话框窗口,同样放一个TreeView,接收到的节点放入这个控件,通过按钮增加、删除、修改节点,完成时返回编辑好的节点。
https://github.com/wuqinchao/JwControls/blob/master/Jw.Winform.Ctrls/JwNavbar/JwNavbarDesigner.cs
在设计时如何控制响应节点展开及收起
控制节点展开及收起同样在设计器类中实现
- 增加一个自定义Behavior,从Behavior继承,重写OnMouseDown和OnMouseUp方法,检查判断鼠标点击事件,并调用控件Collapse和Expand实现折叠和展开。
- 增加自定义Glyph,从Glyph继承,构造时指定我们自定义的Behavior, 使我们能接收和响应鼠标事件。
- override设计器的GetGlyphs方法, 这个方法可以通过ISelectionService接口增加我们自定义的Glyph
设计时支持比较繁琐,中文资料也很少,大家共同学习。