我正在开发一个C#包含的应用程序RichTextBox,用户可以在其中放入一些C#代码,并像Visual Studio那样通过缩进来对其进行格式化。
private void btnEdit_Click(object sender, EventArgs e)
{
//rchCode.Text= formattedCode; //Which I haven't got anywhere so far
}
Run Code Online (Sandbox Code Playgroud)
我寻找了同样的问题,这个答案建议使用称为NArrange的东西,但我不想使用其他工具,加载项等。
同样,这提供了CodeDOM方式,但我还没有弄清楚如何使用它(如果仍然有帮助的话)
我想通过写一些实际的代码来做到这一点。有没有人做过或知道如何做?
要正确缩进代码,您将需要Microsoft.CodeAnalysis.CSharp nuget包和.NET Framework 4.6+。样例代码:
public string ArrangeUsingRoslyn(string csCode) {
var tree = CSharpSyntaxTree.ParseText(csCode);
var root = tree.GetRoot().NormalizeWhitespace();
var ret = root.ToFullString();
return ret;
}
Run Code Online (Sandbox Code Playgroud)
单线:
csCode = CSharpSyntaxTree.ParseText(csCode).GetRoot().NormalizeWhitespace().ToFullString();
Run Code Online (Sandbox Code Playgroud)
您也可以使用NArrange在CS文件中对方法进行排序,组织使用,创建区域等。
所以我这样得到了解决方案:
它仍然不完美(因为它总是在第一个代码行之前添加一个或多个新行)。因此,如果有人可以改进它或有更好的方法,我将不胜感激任何新建议。
private void btnEdit_Click(object sender, EventArgs e)
{
RichTextBox rchTemp = new RichTextBox();
foreach (string line in rchCode.Lines)
{
rchTemp.AppendText("\r\n" + line.Trim());
}
RichTextBox rchTemp2 = new RichTextBox();
int indentCount = 0;
bool shouldIndent = false;
foreach (string line in rchTemp.Lines)
{
if (shouldIndent)
indentCount++;
if (line.Contains("}"))
indentCount--;
if (indentCount == 0)
{
rchTemp2.AppendText("\r\n" + line);
shouldIndent = line.Contains("{");
continue;
}
string blankSpace = string.Empty;
for (int i = 0; i < indentCount; i++)
{
blankSpace += " ";
}
rchTemp2.AppendText("\r\n" + blankSpace + line);
shouldIndent = line.Contains("{");
}
rchCode.Text = rchTemp2.Text;
}
Run Code Online (Sandbox Code Playgroud)