【问题标题】:Custom control generate code at design time自定义控件在设计时生成代码
【发布时间】:2009-11-20 05:20:24
【问题描述】:

是否可以编写一个可以在同一个项目中创建/修改代码文件的控件-(按照表单设计器的工作方式)。我看不到文件的实际创建/修改很麻烦 - 但是我想避免'xyz文件已被修改 - 你想重新加载它吗?对话。

老实说,我不希望不编写插件或类似的东西就可以做到。

【问题讨论】:

    标签: c# design-time


    【解决方案1】:

    Absolutley,看看 CodeDom:-

    http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx

    或者考虑创建一个 Visual Studio 插件:-

    http://www.c-sharpcorner.com/UploadFile/mgold/AddIns11292005015631AM/AddIns.aspx

    干杯,

    菲尔。

    【讨论】:

      【解决方案2】:

      这确实是可以做到的。引用后EnvDTE

      using EnvDTE;
      
      
          var host = this.Container as IDesignerHost;
          var dte = host.GetService(typeof(DTE)) as DTE;
          var activeDoc = dte.ActiveDocument;
          var project = activeDoc.ProjectItem.Collection.Parent as Project;
          project.ProjectItems.AddFromFile("\\Test.cs");
      

      【讨论】:

        【解决方案3】:

        正如 Plip 所说,使用 CodeDom,更具体地说 - CodeDocSerialier。 这是一个简短的例子:

        [Serializer(typeof(MySerializer))]
        class MyControl : Control {}
        
        class MySerializer : CodeDomSerializer
        {
            public override object Serialize(IDesignerSerializationManager manager, object value)
            {
              CodeDomSerializer baseSerializer;
              CodeStatementCollection statements;
              CodeExpression targetObject;
        
              if(manager == null || value == null)
              {
                return null;
              }
        
              baseSerializer = (CodeDomSerializer)manager.GetSerializer(typeof(MyControl).BaseType, typeof(CodeDomSerializer));
              statements = baseSerializer.Serialize(manager, value) as CodeStatementCollection;
              if(statements == null)
              {
                statements = new CodeStatementCollection();
              }
        
              targetObject = GetExpression(manager, value);
              if(targetObject != null)
              {
                // add 'myControl.Visible = true;' statement.
                statements.Add(
                  new CodeAssignStatement(
                    new CodeFieldReferenceExpression(targetObject, "Visible"),
                    new CodePrimitiveExpression(true)));
              }
              return statements;
            }
        }
        

        【讨论】:

        • 不错的答案,但最后的垃圾邮件是怎么回事?
        • Its not a spam! Its 我在许多开发者网站上的页脚(包括非常独立的网站),他们都没有将其视为垃圾邮件,因为它不具有侵入性和冒犯性。我不强迫你阅读分隔线之后的文字。
        • ARM,你没有给自己任何好处。
        猜你喜欢
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 2017-10-02
        相关资源
        最近更新 更多