`
镭风【CHN】
  • 浏览: 108968 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

为控件添加智能标记

阅读更多
在使用系统控件的时候我们经常看见和使用控件的右上角的一个三角型的图标(),点击之后弹出一个菜单,标题是“XXXX 任务”,里面提供了好多方便有用的设置。但是我们自己写的自定义控件中却没有,那如何让自己的UserControl中也有这个功能呢?


想实现功能首先要知道功能的名称吧,不然想去Google一下都不知道要用什么关键字
这个功能叫做“智能标记 smart tag panel“。

今天以最常见的”在父容器中停靠“功能来演示一下如何让自定义控件实现智能标记功能。

一、正所谓”工欲善其事,必先利其器“,首先要引入一个库文件”System.Design“。

二、在自定义控件的命名空间下定义一个类,集成ControlDesigner类。(我自定义的控件叫做AdSchedule,所以给类起名AdScheduleDesigner)
public class AdScheduleDesigner : System.Windows.Forms.Design.ControlDesigner

这个类的作用是”扩展 Control 的设计模式行为“,类中需要定义一个DesignerActionListCollection类型的属性。
private DesignerActionListCollection actionLists;
public override DesignerActionListCollection ActionLists
{
   get
   {
       if (null == actionLists)
       {
           actionLists = new DesignerActionListCollection();
           actionLists.Add(new AdScheduleActionList(this.Component));
       }
       return actionLists;
   }
}


三、在创建一个编写逻辑程序的类
public class AdScheduleActionList : 
System.ComponentModel.Design.DesignerActionList
{
   private AdSchedule adSchedule;
   private DesignerActionUIService designerActionUISvc = null;

   public AdScheduleActionList(IComponent component)
            : base(component)
   {
       this.adSchedule = component as AdSchedule;

       this.designerActionUISvc =
                GetService(typeof(DesignerActionUIService))
                as DesignerActionUIService;
   }
}


四、在AdScheduleActionList类中重写GetSortedActionItems方法。
public override DesignerActionItemCollection GetSortedActionItems()
{
    DesignerActionItemCollection items = new DesignerActionItemCollection();
    items.Add(new DesignerActionMethodItem(this, "ParentComponentStop", "在父容器中停靠"));
    return items;
}


其中DesignerActionMethodItem的构造方法有三个参数:
1、ActionList
2、要通过面板项调用的方法的名称,此方法是从 DesignerActionList 派生的类中的一个方法,其方法名区分大小写。
3、此项的面板文本。

这个函数写好之后就在AdScheduleActionList类中添加需要调用的方法。
public void ParentComponentStop()
{
    componentLocation = adSchedule.Location;
    componentSize = adSchedule.Size;

    adSchedule.Dock = System.Windows.Forms.DockStyle.Fill;
    adSchedule.Location = new System.Drawing.Point(0, 0);
}


五、就这么简单,智能标记已经可以用了


点击以后窗口就可以在父容器中停靠,但是问题来了,如何取消停靠呢?
很简单就是修改GetSortedActionItems方法中的DesignerActionItemCollection。
这里我们还需要创建两个变量,在ParentComponentStop函数中赋值用来保存控件停靠前的位置和大小,以便取消的时候返回原来的样子。
public override DesignerActionItemCollection GetSortedActionItems()
{
   DesignerActionItemCollection items = new DesignerActionItemCollection();
   if (DockStyle.None == adSchedule.Dock)
          items.Add(new DesignerActionMethodItem(this, "ParentComponentStop", "在父容器中停靠"));
   else
          items.Add(new DesignerActionMethodItem(this, "CancelParentComponentStop", "取消在父容器中停靠"));
   return items;
}

public void CancelParentComponentStop()
{
   if (null == componentLocation)
       componentLocation = adSchedule.Location;
   if (null == componentSize)
       componentSize = adSchedule.Size;

   adSchedule.Dock = DockStyle.None;
   adSchedule.Location = componentLocation;
   adSchedule.Size = componentSize;

   designerActionUISvc.Refresh(this.Component);
}


还没有完,点击之后为什么还是“在父容器中停靠”?文字没有变化呢?
还记得designerActionUISvc这个变量吗?他用来缓存DesignerActionUIService,以实现DesigneractionList刷新功能。
在ParentComponentStop函数最后加上这句话
designerActionUISvc.Refresh(this.Component);

现在就大功告成了 ,喝杯咖啡自己欣赏一下


这只是个简单的应用,简单的文字链接形式实现调用函数,其实在智能标记中可以实现很多功能,大家可以参考一下MSDN,给DesignerActionItemCollection传入不同类型的值就会实现更多的操作。


完整的代码可以从附件中下载。

参考MSDN文献:
演练:向 Windows 窗体组件添加智能标记
如何:向 Windows 窗体组件附加智能标记
  • 大小: 7.6 KB
  • 大小: 2.7 KB
  • 大小: 6.9 KB
1
1
分享到:
评论

相关推荐

    使用智能标记功能自定义用户控件

    本文介绍了如何向用户控件添加智能标记功能。

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    6.7 对动态添加控件的视图状态分析 228 6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    6.7 对动态添加控件的视图状态分析 228 6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    6.7 对动态添加控件的视图状态分析 228 6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

    6.7 对动态添加控件的视图状态分析228 6.8 自定义类型转换器实现高效率序列化231 6.9 页面状态性能优化策略238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端238 6.9.2 体积优化——压缩视图状态...

    VC DataGrid导出Excel

    6、在ProjectXDlg.h中添加变量(智能指针变量和标记记录集数量的变量) 7、在ProjectXDlg.cpp中添加头文件引用:#include "Excel.h"、#include "_recordset.h"、#include "Columns.h" 、#include "Columns.h" 8、在...

    ASP.net技术内幕

    4.2 显示和隐藏内容 4.2.1 使用Visible和Enabled属性 4.2.2 使用Panel控件 4.2.3 模拟多页面表单 4.2.4 通过程序添加控件 4.2.5 将控件添加到页面 4.2.6 PlaceHolder控件 ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    2.8.3 使用智能标记 32 2.8.4 保存和导入Visual Studio设置 32 2.8.5 验证HTML 34 2.8.6 团队的合作 36 2.8.7 使用代码片断 36 2.9 小结 38 第3章 应用程序和页面框架 39 3.1 应用程序的位置选项 39 3.1.1 ...

    asp.net技术内幕(1)

    4.2.4 通过程序添加控件 4.2.5 将控件添加到页面 4.2.6 PlaceHolder控件 4.2.7 动态产生表单 4.2.8 动态产生列表条目 4.3 使用复杂控件 4.3.1 使用Calendar控件显示交互式的日历 ...

    asp.net技术内幕(2)

    4.2.4 通过程序添加控件 4.2.5 将控件添加到页面 4.2.6 PlaceHolder控件 4.2.7 动态产生表单 4.2.8 动态产生列表条目 4.3 使用复杂控件 4.3.1 使用Calendar控件显示交互式的日历 ...

    asp.net技术内幕(5)

    4.2.4 通过程序添加控件 4.2.5 将控件添加到页面 4.2.6 PlaceHolder控件 4.2.7 动态产生表单 4.2.8 动态产生列表条目 4.3 使用复杂控件 4.3.1 使用Calendar控件显示交互式的日历 ...

    asp.net技术内幕(4)

    4.2.4 通过程序添加控件 4.2.5 将控件添加到页面 4.2.6 PlaceHolder控件 4.2.7 动态产生表单 4.2.8 动态产生列表条目 4.3 使用复杂控件 4.3.1 使用Calendar控件显示交互式的日历 ...

    asp.net技术内幕(3)

    4.2.4 通过程序添加控件 4.2.5 将控件添加到页面 4.2.6 PlaceHolder控件 4.2.7 动态产生表单 4.2.8 动态产生列表条目 4.3 使用复杂控件 4.3.1 使用Calendar控件显示交互式的日历 ...

    ASP.NET2.0高级编程(第4版)1/6

    2.8.3 使用智能标记32 2.8.4 保存和导入  Visual Studio设置32 2.8.5 验证HTML34 2.8.6 团队的合作36 2.8.7 使用代码片断36 2.9 小结38 第3章 应用程序和页面框架39 3.1 应用程序的位置选项39 3.1.1 内置的Web...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例011 为项目添加第三方控件 13 实例012 为项目添加已有窗体 14 第2章 C#语言基础应用 15 2.1 代码的注释 16 实例013 对单行代码进行注释 16 实例014 快速对多行代码进行注释 17 实例015 使用“/”标记给代码段...

Global site tag (gtag.js) - Google Analytics