`
镭风【CHN】
  • 浏览: 110580 次
  • 性别: 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
分享到:
评论

相关推荐

    c#自定义控件开发.pdf

    6. 向新用户控件添加任何标记和控件,并为该用户控件添加执行的所有任务(例如,处理控件事件或从数据源读取数据)添加代码。 四、检查控件的设计时行为 1. 启动 VS2005。 2. 通过从“文件”菜单单击/新建/项目/...

    C#自定义控件基础知识

    6. 向新用户控件添加任何标记和控件,并为该用户控件添加执行的所有任务(例如,处理控件事件或从数据源读取数据)添加代码。 在检查控件的设计时行为时,可以通过以下步骤: 1. 启动 VS2005。 2. 通过从“文件”...

    如何使用智能标记创建Web服务器控件

    2. **添加智能标记支持**:为了使你的控件支持智能标记,需要实现`ISmartTagAware`接口。这个接口有一个方法`GetSmartTagActions`,你需要在这个方法中返回一个`SmartTagActionCollection`实例,其中包含了你想要...

    C#写的ASP.NET下使用的日期自定义控件源代码

    这个控件为开发者提供了更灵活、自定义的日期选择功能,可以提升用户体验并简化后端处理。 描述中提到的特性有: 1. **年月日下拉选择**:这意味着控件包含了三个下拉列表,分别用于选择年、月和日,用户可以通过...

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

    要向用户控件添加`Smart Tag`功能,我们需要遵循以下步骤: 1. **创建自定义用户控件**: 首先,创建一个新的用户控件类,继承自`System.Windows.Forms.UserControl`。在该类中,我们可以定义控件的外观和行为。 ...

    MSChart控件MSChart控件MSChart控件MSChart控件

    MSChart控件广泛应用于数据分析报告、商业智能系统、监控界面等领域,如展示销售趋势、比较不同产品性能、监控系统状态等。通过MSChart控件,开发者能够快速构建功能丰富的数据可视化应用,帮助用户更好地理解和解析...

    net 自己制作WinForm控件 (2).pdf

    4. **为控件添加属性** - 控件应使用属性而非公共字段,以便在属性浏览器中显示。 - 属性提供智能字段功能,通常包括get和set访问器。 - 示例: - 定义私有数据成员:`private int number = 0;` - 声明公共属性...

    dxdbgrid控件属性介绍

    - `egoTabs`:启用Tab键在不同控件间的导航,如果`Shift+Tab`设置为FALSE,则会影响前向导航到下一个关键控件的平滑过渡。 - `egoTabThrough`:在按下Tab键时,焦点将跳转到下一个可用控件,此选项在`egoTabs`启用时...

    dappermap地图控件1.5.0.2

    此外,自定义符号库的添加为地图定制提供了更多可能。用户可以根据需求创建和导入个性化的图标、标记,以更直观地表示不同类型的地理对象或数据。这在地图制图、地理信息系统开发和数据可视化中尤为重要,能够使地图...

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

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

    symbian S60 2nd 自定义控件

    3. **Calendar**:在Symbian S60 2nd版中,自定义Calendar控件可能包括改变日期的显示格式、颜色,或者添加特定的事件标记。开发者可能需要利用系统API来获取日期和时间信息,并实现用户选择日期时的反馈机制。...

    中华地图控件 V1.0.0官方版

    此外,该控件还支持自定义地图样式和图层,开发者可以根据自己的需求定制地图的显示效果,如改变颜色主题、添加个性化标记等,从而打造独一无二的地图界面,增强应用的品牌识别度。 在实际应用中,"chinamap"这个...

    波形显示控件

    此外,为了提高用户体验,我们可能需要添加交互功能,比如缩放、平移、标记和测量工具。这些可以通过鼠标事件和键盘事件来实现。例如,鼠标滚轮可以用来改变波形的放大倍数,鼠标拖动可以平移视图。 最后,为了方便...

    在 GridView 控件中使用 TemplateField

    通过设计器将 `GridView` 控件添加到页面上,并通过智能标记为其配置 `ObjectDataSource`。 - **步骤2:配置 GridView** 绑定完成后,`GridView` 自动为每个员工属性添加了一个 `BoundField`。但是,对于这个示例...

    ASP.NET AJAX控件之AutoComplete视频+源码

    首先,需要在页面上添加控件,通常通过Visual Studio的工具箱或直接在ASP.NET标记中定义。控件的属性包括数据源、如何匹配项、延迟时间等,可以进行精细调整以满足不同需求。例如,`ServiceMethod`属性指定服务器端...

    C#仪表控件(含源代码)

    本资源名为“C#仪表控件(含源代码)”,显然是为了帮助开发者理解和实现仪表类型的UI元素,以显示系统状态或数据。 仪表控件通常用于模拟物理设备的仪表盘,如速度表、压力计或电量指示器,以可视化的方式表示数值或...

    GridView控件实现主细表

    2. 主表GridView配置:在设计视图中,通过智能标记为GridView设置数据源,并定义列以展示主数据。可以自定义列的样式、排序、分页等功能。使用`AllowPaging="true"`启用分页,`AllowSorting="true"`允许列排序。 3....

Global site tag (gtag.js) - Google Analytics