Composite UI Application Block 之自定义UIElement(二)

Programming Microsoft® Composite UI Application Block Programming Microsoft® Composite UI Application Block and Smart Client Software Factory WinForm的CAB/SCSF框架 立即下载

目标:让我们建立一个树形结构菜单,具体的说用一个TreeView来显示菜单。先看效果图

 

1、首先我们需要建立一个自定义的TreeView,实现单击事件。

 

namespace CustomUIElements
{
    
public delegate void NodeClickedEvent(object sender, TreeNode nodeClicked);

    
public class ClickableTreeNode : TreeNode
    
{
        ClickableTreeView _parent 
= null;
        
public event EventHandler NodeClick;

        
private bool _needsSetup = false;
        
public bool NeedsSetup
        
{
            
get { return _needsSetup; }
        }

        
public ClickableTreeNode()
            : 
base()
        
{
            _needsSetup 
= true;
        }


        
public new ClickableTreeView TreeView
        
{
            
get { return _parent; }
        }


        
public void SetUp(ClickableTreeView tv)
        
{
            ClickableTreeView clickable 
= tv as ClickableTreeView;
            
if (clickable == null) throw new Exception("The clickable tree node was added to a non-clickable tree view");

            _parent 
= clickable;
            
// register for the node clicked event, when *a* node gets clicked
            clickable.NodeClicked += new NodeClickedEvent(clickable_NodeClicked);

            _needsSetup 
= false;
        }


        
public ClickableTreeNode(ClickableTreeView tv) : base()
        
{
            ClickableTreeView clickable 
= tv as ClickableTreeView;
            
if (clickable == null) throw new Exception("The clickable tree node was added to a non-clickable tree view");

            _parent 
= clickable;
            
// register for the node clicked event, when *a* node gets clicked
            clickable.NodeClicked += new NodeClickedEvent(clickable_NodeClicked);
        }


        
void clickable_NodeClicked(object sender, TreeNode nodeClicked)
        
{
           
// if the node is actually us, then fire the NodeClick event...
            if ((nodeClicked as ClickableTreeNode) == this)
            
{              
                
if (NodeClick != null)
                    NodeClick(
this, new EventArgs());
            }
              
        }

    }


    
public class ClickableTreeView : TreeView
    
{
        
public event NodeClickedEvent NodeClicked;

        
public ClickableTreeView() : base()
        
{
            
this.MouseClick += new MouseEventHandler(ClickableTreeView_MouseClick);
        }


        
void ClickableTreeView_MouseClick(object sender, MouseEventArgs e)
        
{
            TreeViewHitTestInfo inf 
= HitTest(e.X, e.Y);
            
if (inf.Node == null) return; // didnt click a node...

            
// we clicked a node, so notify that one was clicked...
            if (NodeClicked != null)
                NodeClicked(
this, inf.Node);
            
        }
       
    }

}

2、我们需要的是建立两个我们自己的类,分别实现IUIElementAdapterFactory和UIElementAdapter<T>。

 

 public class ClickableTreeViewAdapterFactory : IUIElementAdapterFactory
    
{
        
IUIElementManagerFactory Members

        
IUIElementAdapterFactory Members
    }

 

 

 public class ClickableTreeViewAdapter: UIElementAdapter<ClickableTreeNode>
    
{
        
private ClickableTreeView _managed = null;
        
private ClickableTreeNode _managedNode = null;
        
public ClickableTreeViewAdapter(ClickableTreeView element)
        
{
            _managed 
= element;
        }


        
public ClickableTreeViewAdapter(ClickableTreeNode node)
        
{
            _managedNode 
= node;
        }


        
protected override void Remove(ClickableTreeNode uiElement)
        
{
            
if (_managed != null)
            
{
                
if (!_managed.IsDisposed)
                
{
                    
if (_managed.Nodes.Contains(uiElement))
                        _managed.Nodes.Remove(uiElement);
                }

            }

            
else if (_managedNode != null)
            
{
                
if (!_managedNode.TreeView.IsDisposed)
                
{
                    
if (_managedNode.Nodes.Contains(uiElement))
                        _managedNode.Nodes.Remove(uiElement);
                }

            }

        }

    
        
protected override ClickableTreeNode Add(ClickableTreeNode item)
        
{
            
if (_managed != null)
            
{
                
if (item.NeedsSetup)
                    item.SetUp(_managed);
                _managed.Nodes.Add(item);
            }

            
else if (_managedNode != null)
            
{
                
if (item.NeedsSetup)
                    item.SetUp(_managedNode.TreeView);
                _managedNode.Nodes.Add(item);
            }


            
return item;
        }
        
    }

 

3、在初始化阶段注册我们自定义的界面工厂

 

        protected override void AfterShellCreated()
        
{
            
base.AfterShellCreated();

            IUIElementAdapterFactoryCatalog catalog 
= RootWorkItem.Services.Get<IUIElementAdapterFactoryCatalog>();
            catalog.RegisterFactory(
new ClickableTreeViewAdapterFactory());

            
// both main menus should have their items added to the root nodes collection
            RootWorkItem.UIExtensionSites.RegisterSite(UIExtensionConstants.MAINMENU, Shell.MainNavigationTree);

            
// Load the menu structure from App.config
            UIElementBuilder.LoadFromConfig(RootWorkItem, Shell.MainNavigationTree);
        }
CAB Composite UI Application Block December Composite UI Application Block December 2005 (C#) 立即下载

相关推荐

RK3588 C-PHY摄像头驱动升级踩坑记:从‘Only CSI2 supported’报错到成功取流

本文详细记录了在RK3588平台上调试C-PHY摄像头驱动的全过程,从‘Only CSI2 supported’报错分析到成功取流。内容涵盖C-PHY与CSI-2协议差异、SDK版本对比、V4L2框架下的bus-type解析机制,以及硬件排查与寄存器调优实战经验,为嵌入式Camera驱动工程师提供宝贵参考。

weixin_42522374的博客 124

Composite UI Application Block (CAB) 详解

微软开发了一套开源的企业库(Enterprise Library),通过使用这套企业库里面提供的各种应用程序块可以极大的提高应用程序的开发效率和缩短开发周期,也由此得到了大家的广泛应用。 企业库包括大家熟知的如下应用程序块: Caching Application Block. Cryptography Application Block. Data Access Applicatio...

顺其自然~专栏 1477

算法笔记(胡凡)学习笔记@Kaysen

本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区分大小写。 一、整型 整型int,32bit(4Byte),取值范围是,绝对值在范围内的整数都可以定义成int。 长整型long long,64bit(8Byte),取值范围是,绝对值超过的整数就需要用long long存储。 ...

Kaysen_Zhao的博客 2898

Composite UI Application Block(Cab)实例学习资料收集

1.1. Commands1.1.1.    类关系图图 2‑6 主要类关系图说明:1.         Command定义了一个命令,如“FileExit”,它跟一系列的CommandAdapter相关,好比一个命令可以从多个地方下发(菜单或工具栏等等)。2.         Command持有一个ICommandAdapterMapService接口,也正是这个接口,通

牛牛工作室 9634

如何点亮一颗sensor

要点亮一个sensor需要从,时钟、sensorI2C,供电,reset脚,mipi的配置几个方面一一确认。 reset脚拉高 给sensor的时钟有没有。(目前用到的常为24MHZ) 供电 查看sensor的数据手册,看有几个电源,用示波器量一下是否为手册规定的电压 比如:DVDD 数字电压: AVDD模拟电压 DOVDD芯片引脚出来的电压等为多少。 sensor的I2C能否抓到 将I2C的口对应上,用示波器量取i2c的波形。 检查有应答并且数据正确。读写地址是否正...

weixin_40787463的博客 3648

移动端UI自动化测试新框架Maestro:声明式语法与实战指南

UI自动化测试是保障移动应用质量的关键环节,其核心原理是通过脚本模拟用户操作,对应用界面进行自动验证。传统命令式框架(如基于Selenium WebDriver的Appium)虽然控制粒度细,但脚本编写和维护成本较高。声明式测试框架则通过描述“做什么”而非“怎么做”,显著降低了技术门槛和维护复杂度,其技术价值在于提升测试脚本的可读性、编写效率与跨团队协作能力。在移动端测试领域,这尤其适用于需要快速验证核心业务流程、进行冒烟测试和回归测试的场景。本文聚焦的**Maestro框架**,正是这一理念的杰出实践。它

weixin_32921023的博客 713

组合界面程序块介绍(Composite UI Application Block)

 组合界面程序块介绍(Composite UI Application Block) 看来微软要全力推SmartClient了,Application Block推出了一个又一个。我们这个项目既然要用SmartClient,自然会关注这些好东东。目前我们确定要使用的Application Block 包括, Offline 和 CompositeUI 。有的同学就会说,这些个Block

funstar888的专栏 3240

Windows加域迁移避坑指南:Profwiz工具实战中的5个常见问题与解决方案

本文详细解析了使用Profwiz工具进行Windows加域迁移时的5个常见问题及解决方案,包括临时配置文件生成、密码策略冲突、SID冲突等。通过实战案例和优化技巧,帮助IT运维团队高效完成账户配置文件迁移,确保Active Directory环境下的数据完整性和权限无缝衔接。

q9r0s的博客 519

智能客户端应用学习系列:SmartClient Software factory中的Composite UI Application Block(Cab)技术了解(九):Custom WorkSpace

WorkSpace扩展       自定义WorkSpace分两种方式:一种是Control_Based;一种是WorkSpace_Based。这两种的具体区别就是继承的接口不同,而且开发的方式也不同,前者以用户控件形式开发,后者是以组件方式开发。先看看两种方式的WorkSpace视图:图3.3.11.         Control_Based方式这个例子思路上很简单,就

牛牛工作室 1757

Qt实现YOLO目标检测及其界面制作(附完整源码)

Qt实现YOLO目标检测及其界面制作(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2739

基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真

新能源微电网是现代电力系统的重要组成部分,能够有效整合分布式能源(如光伏、风力发电)和储能设备,实现局部区域内的能源高效利用。微电网的运行控制涉及多源能量管理、负荷平衡以及并网/孤岛模式切换等关键问题。基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真,可以帮助研究者验证控制策略的有效性,并优化系统的动态性能和经济性。本项目旨在构建一个完整的新能源微电网模型,包括电源模块、储能模块、负荷模块以及控制器模块,并通过仿真分析其运行特性。

xiaoheshang_123的博客 424

Composite UI Application Block开发的介绍

完成本实验之后,您能够:·         了解Composite UI Application Block。·         使用Composite UI Application Block 的Module Loading特性。·         了解推荐

老翁的嵌入式专栏 3676

【OpenClaw从入门到精通】第15篇:国产芯片适配实战——昇腾/龙芯/天数智芯全流程跑通(2026实测版)

2026年国产芯片AI适配迎来爆发期,OpenClaw作为轻量化本地AI智能体,已实现华为昇腾、龙芯、天数智芯等主流国产平台的全流程适配。本文基于实测数据,从背景解析、核心原理、算法优化、实操部署四个维度,详细讲解OpenClaw在香橙派昇腾开发板、龙芯3B6000M、天数彤央TY1200及联想开天X7h的部署流程,同时提供统一工具玄武CLI的使用指南。文中包含完整代码、执行结果、避坑技巧及虚拟实战案例,兼顾新手入门与进阶提升,帮助读者快速掌握国产芯片上的本地AI部署能力,实现数据隐私保护与低成本AI落地。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1008

Composite UI Application Block (CAB) 概念和术语

首先我们来看看Composite UI Application Block中涉及的相关概念和术语。这里会做一个简单的介绍,后续文章会详细说到其用法。 应用程序架构元素 CAB. Composite UI Application Block的缩写 Module. 应用程序的组成部件,其中包含SmartParts,支持Service,业务逻辑和配置信息等 ObjectBuilder.通过策略和...

weixin_30565327的博客 275

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Composite UI Application Block 之自定义UIElement

1.1. UIElement1.1.1.    接口定义 图 2‑1 IUIElementAdapterFactoryCatalog其中UIElementAdapterFactoryCatalog是CAB中提供的默认实现图 2‑2 IUIElementAdapterFactoryCompositeUI.WinForms中有一个实现了该接口的ToolStrip

烟沉往逝 1195

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SmartClient Software factory中的Composite UI Application Block(Cab)技术了解(三):UIElement

UIElement描述和实例       UIElement在SCSF中是只视图上的控件,包括MENU控件,TOOLBAR控件以及自定义控件等等,这里重点是说一说自定义控件部分,因为在Symphony中如果要统一视图风格,自定义控件是必不可少的技术,而制作自定义控件在SCSF中需要先分别继承并实现两个接口:UIElementAdapter,IUIElementAdapterFactory。这样

牛牛工作室 2065

SmartClient Software factory中的Composite UI Application Block(Cab)技术了解(一):Shell&amp;Layout

序本来以为SmartClient Software factory(以下简称SCSF)已经发布了不短的时间了,在网上应该有不少它的资料,结构找了几天还是失望了,网上的资料很少,而且多数好点的资料只有E文的。那也没所谓了,关键是连E文的资料也是说的比较简单,即使是MSDN也说的不是很好,最后还是只能自己来研究,用了半个月左右的时间,终于对SCSF有一点了解了,这里把一些例子写下来,让自己有个参考

牛牛工作室 2995

Composite UI Application Block (2) ------ Design of CAB

一、总体设计目标 1. 模块化CAB的主要目标之一就是要支持分离但又有协作的模块组合开发。 这些模块包含如下类型组件:SmartPart,WorkItem,Controllers,Workspaces,Supporting features(UIElements,Event broker,State persistence)。要注意的是,CAB并没有定义服务单元的结构和行为。见图一。

xingys的专栏 561

2,Composite UI Application Block (CAB) 概念和术语

首先我们来看看Composite UI Application Block中涉及的相关概念和术语。这里会做一个简单的介绍,后续文章会详细说到其用法。 应用程序架构元素 CAB. Composite UI Application Block的缩写 Module. 应用程序的组成部件,其中包含SmartParts,支持Service,业务逻辑和配置信息等 ObjectBuilder.通...

weixin_33901843的博客 180

Composite UI Application Block

The Composite UI Application Block is a framework based on .NET 2.0, developed the patterns & practices team to assist anyone building complex UIs using Winforms.The key design pattern: composabil...

weixin_30814223的博客 166

Composite UI Application Block学习笔记 Event Broker

Composite UI Application Block学习笔记之Event Broker      Composite UI Application Block着重于将应用逻辑和界面分开,让应用系统具备更清晰的结构,更强的扩展性、可移植性。在曹严明先生的讲座中,提及到了关于应用CAB开发的几个指导性原则:将 views (SmartPart)设计为独立于 controllers

zhaojp0411的专栏 854

1,Composite UI Application Block (CAB) 介绍

微软开发了一套开源的企业库(Enterprise Library),通过使用这套企业库里面提供的各种应用程序块可以极大的提高应用程序的开发效率和缩短开发周期,也由此得到了大家的广泛应用。 企业库包括大家熟知的如下应用程序块: Caching Application Block. Cryptography Application Block. Data Access A...

weixin_34319640的博客 187

Composite UI Application Block 之一:概述

   在网上找了很久,希望能找到相关的文章,然后自己可以不用打那么多字,现在没办法了。但是还是坚持一个原则,能引用别人的就不自己写。CAB简单了说就是一套程序集,或者说是一套代码框架。使用了很多设计模式以优化软件开发,主要是实现winForm桌面程序开发的。CAB 的优点:1:允许构建由各个具有协作关系的独立模块组合成的复杂应用。2:分离关注点,能将各个模块的开发的关注点和Shel

xujianrj的专栏 1022

Composite UI Application Block 初试

初试Composite UI Application Block Composite UI Application Block主要用来创建一个聚合的智能客户端解决方案,客户端可以由一组功能块构建而成。 一、用Composite UI 创建应用程序的一般步骤 创建Shell ...

weixin_30788619的博客 196

剖析:Composite UI Application Block(前言)

最近在学习CAB。如果从学习上来说,感觉CAB应用了大量的设计模式,可以作为设计模式的学习样板。: )如果从应用的角度看,自己感觉CAB还是有些庞大,而且运行效率也不是很高。我觉得最好的做法应该是根据自己的要求,对CAB做适度的裁剪、扩充,已满足程序的需要。所以就要求必须对CAB了解透彻。从今天开始,我将逐步写一个CAB的剖析文档。由于工作比较忙,可能更新不是很固定,忘大家多包涵。

mmens的专栏 918

Composite UI Application Block 之二:界面设计

相关安装包如下:"Guidance Automation Extensions and Guidance Automation Toolkit": http://msdn.microsoft.com/vstudio/teamsystem/workshop/gat/default.aspx Introduction to the Guidance Automation Toolkit": h

xujianrj的专栏 1064
上一篇: Composite UI Application Block 之自定义CommandAdapter
下一篇: Borland Together 2006 for VS.Net 2005 R2
sendreams
博客等级 码龄22年 23粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值