是否可以编写一个可以在同一个项目中创建/修改代码文件的控件 - (与表单设计器的工作方式一致)。我无法看到文件的实际创建/修改是麻烦的 - 但是我想避免'xyz文件被修改 - 你想重新加载它吗?'对话。
老实说,如果不插一个插件或其他类似的东西,我就没想到我能做到。
答案 0 :(得分:1)
Absolutley,看看CodeDom: -
http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx
或者研究创建Visual Studio加载项: -
http://www.c-sharpcorner.com/UploadFile/mgold/AddIns11292005015631AM/AddIns.aspx
干杯,
菲尔。
答案 1 :(得分:0)
确实可以这样做。引用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");
答案 2 :(得分:0)
正如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;
}
}