如何将智能标签添加到我的 .NET 组件?

Posted

技术标签:

【中文标题】如何将智能标签添加到我的 .NET 组件?【英文标题】:How to add smart tags to my .NET component? 【发布时间】:2010-11-19 21:31:11 【问题描述】:

看下图,它显示了 DataGridView 的智能标记。

DataGridView Smart Tags http://img199.imageshack.us/img199/5871/post517531249536112.jpg

现在我正在创建一个新组件,我希望它支持在智能标签中显示一些属性。如何将属性添加到智能标签?

【问题讨论】:

这是一个很大的话题。你的组件现在有设计师支持吗? 谢谢,为了简化问题,假设我有数字文本框,我想将启用/禁用数字属性添加到智能标签。 谢谢,但这并没有回答我的问题。您的组件目前有设计器支持吗? 【参考方案1】:

我用http://msdn.microsoft.com/en-us/library/default.aspx?q=smart+tag+windows+forms+designer。

结果,我找到了Walkthrough: Adding Smart Tags to a Windows Forms Component。

进行相同搜索的任何人都会找到相同的文章。


更新:该链接不再有效。我刚刚尝试搜索"smart tag windows forms designer",发现"Walkthrough: Adding Smart Tags to a Windows Forms Component" 是第一个搜索结果。在Google 中的相同搜索将"How to: Attach Smart Tags to a Windows Forms Component" 显示为第一个匹配项,但显示与第二个匹配项相同的演练。

【讨论】:

是的。从提问者的角度考虑 - 花 30 秒向数千名专家提出问题比 2 分钟可能会或可能不会产生任何帮助更有价值。这就是我们来这里的目的。粗鲁会影响其他有用的答案。 怎么没用?是攻略。有人应该在这里重复演练吗?而且,我认为假设 OP 能够进行搜索,然后向他展示我使用了哪些搜索词,这并不是屈尊俯就。如果这是一些复杂的搜索,我认为他太愚蠢了,无法独自完成。 @John 我不一定同意这是居高临下的,但这是粗鲁的。您的回答意味着在个人搜索失败后,SO 应该是最后的手段。没有理由这样做。 SO成为人们解决编程问题的第一个地方是非常好的。我们只希望用户做出合理的努力,不要发布重复的问题,仅此而已。 @Rex:这是一种虚假的经济,会导致分层的开发者社区。会有知道的人,也会有询问的人。那不健康。请注意,顺便说一句,专家不需要花两分钟时间进行搜索!如果 OP 不知道 MSDN 搜索,我发布链接的事实教会了他。如果他无法弄清楚要使用哪些搜索词(也许他没有尝试“设计师”),我会向他展示要使用哪些搜索词。我试图让他与我平等,而不是继续优于他! @All:如果你认为我在乎数字,那我就留下了错误的印象。我想知道反对票的原因,仅此而已。我实际上认为重要的是,有时候,站稳脚跟,不要被推向错误的方向。如果我们“让”开发人员只是来这里并要求一些专家为他们做所有事情,那么他们自己永远不会成为专家。这对他们不利,对我们也不利,而且我还没有准备好停止试图影响它。【参考方案2】:

您可以使用以下代码查看自定义控件中的示例标记。

您可以从 www.windowsclient.com 获取有关此的视频。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel.Design;
namespace MakeSmartTag

    public enum Languages
    
        English,
        Arabic,
        Japanese
    

    [Designer(typeof(UserControlDesigner))]
    public partial class UserControl2 : UserControl
    
        public UserControl2()
        
            InitializeComponent();
        

        private Languages _language;

        public Languages Language
        
            get  return _language; 
            set
            
                switch (value)
                
                    case Languages.Arabic:
                        
                            label1.Text = "مرحباً";
                            _language = value;
                        
                        break;
                    case Languages.English:
                        
                            label1.Text = "Hello";
                            _language = value;
                        
                        break;
                    case Languages.Japanese:
                        
                            label1.Text = "Conechoa";
                            _language = value;
                        
                        break;
                
            
        
    

    public class UserControlDesigner : System.Windows.Forms.Design.ControlDesigner
    
        private DesignerActionListCollection lists;
        public override DesignerActionListCollection ActionLists
        
            get
            
                if (lists == null)
                

                    lists = new DesignerActionListCollection();
                    lists.Add(new UserControlActioonList(this.Component));
                
                return lists;
            
        
    

    public class UserControlActioonList : DesignerActionList
    
        private UserControl2 myUserControl;
        private DesignerActionUIService designerActionSvc = null;

        public UserControlActioonList(IComponent component)
            : base(component)
        
            this.myUserControl = (UserControl2)component;

            this.designerActionSvc =
              (DesignerActionUIService)GetService(typeof(DesignerActionUIService));
        

        private PropertyDescriptor GetPropertyByName(string propName)
        
            PropertyDescriptor prop = default(PropertyDescriptor);
            prop = TypeDescriptor.GetProperties(myUserControl)[propName];
            if (prop == null)
            
                throw new ArgumentException("Invalid Property", propName);
            
            else
            
                return prop;
            
        

        public override System.ComponentModel.Design.DesignerActionItemCollection GetSortedActionItems()
        
            DesignerActionItemCollection item = new DesignerActionItemCollection();
            item.Add(new DesignerActionHeaderItem(
                       "المظهر"));
            item.Add(new DesignerActionPropertyItem(
                       "BackColor", "لون الخلفية", "Appearance", "Set background Color of the control"));
            item.Add(new DesignerActionHeaderItem("تحديد اللغة"));
            item.Add(new DesignerActionPropertyItem(
                       "Language", "اللغة", "Functions", "Set the language of the control"));
            return item;
        

        public Color BackColor
        
            get  return this.myUserControl.BackColor; 
            set  GetPropertyByName("BackColor").SetValue(myUserControl, value); 
        

        public Languages Language
        
            get  return this.myUserControl.Language; 
            set  GetPropertyByName("Language").SetValue(myUserControl, value); 
        
    

【讨论】:

以上是关于如何将智能标签添加到我的 .NET 组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 scss 导入到我的 Vue 组件中?

如何覆盖作为复合组件一部分的标签的 CSS?

无法将图表添加到我的 vue 组件

如何将 CSS 样式应用到我的 <Loader /> React 组件?

将 Vuetify 添加到我的 laravel/Vue 应用程序会破坏一些 laravel 组件 css

添加到我的小程序提示组件