C# 自定义控件在设计时生成代码

C# 自定义控件在设计时生成代码,c#,design-time,C#,Design Time,是否可以编写一个控件,该控件可以在同一项目中创建/修改代码文件?(按照表单设计器的工作方式)。我看不出文件的实际创建/修改很麻烦-但是我希望避免“xyz文件已被修改-是否要重新加载?”对话框 老实说,我并不期望我可以不写插件之类的东西。Absolutey,看看代码:- 或者,研究创建Visual Studio外接程序:- 干杯 菲尔。这确实是可能的。参考EnvDTE using EnvDTE; var host = this.Container as IDesignerHost;

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


老实说,我并不期望我可以不写插件之类的东西。

Absolutey,看看代码:-

或者,研究创建Visual Studio外接程序:-

干杯


菲尔。

这确实是可能的。参考
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");

正如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;
    }
}

回答得很好,但最后的垃圾邮件是怎么回事?它不是垃圾邮件!它s我在许多开发者网站(包括各自的网站)上的页脚,没有一个开发者不将其视为垃圾邮件,因为它不具有侵入性和攻击性。我不会强迫你读分隔线后面的文本。ARM,你没有帮自己任何忙。