基于WPF實(shí)現(xiàn)簡單C#代碼編輯功能的完整流程
引言
在開發(fā)輕量級開發(fā)工具、代碼演示程序或嵌入式調(diào)試工具時(shí),常常需要集成簡單的 C# 代碼編輯功能。WPF(Windows Presentation Foundation)憑借其靈活的界面定制能力、數(shù)據(jù)綁定特性和控件擴(kuò)展能力,能夠輕松實(shí)現(xiàn)一款支持 C# 代碼高亮、基礎(chǔ)編輯、語法提示的簡單代碼編輯器。這款編輯器無需依賴復(fù)雜的第三方控件庫,基于 WPF 內(nèi)置控件即可完成核心功能,滿足輕量級 C# 代碼編輯的場景需求。本文將詳細(xì)講解 WPF 實(shí)現(xiàn)簡單 C# 代碼編輯功能的完整流程,包括界面設(shè)計(jì)、語法高亮、基礎(chǔ)編輯邏輯與功能優(yōu)化。
一、核心功能規(guī)劃
一款簡單實(shí)用的 WPF C# 代碼編輯器,需覆蓋基礎(chǔ)的代碼編輯與視覺優(yōu)化需求,本次實(shí)現(xiàn)的核心功能如下:
- 基礎(chǔ)代碼編輯:支持 C# 代碼的輸入、刪除、復(fù)制、粘貼、撤銷 / 重做,兼容常規(guī)文本編輯操作;
- C# 語法高亮:對關(guān)鍵字(如
using、class、if)、注釋(單行//、多行/* */)、字符串(""包裹)進(jìn)行差異化著色,提升代碼可讀性; - 代碼格式輔助:支持行號顯示、制表符縮進(jìn)(Tab 鍵)、自動換行,模擬專業(yè)編輯器的基礎(chǔ)體驗(yàn);
- 界面適配:采用彈性布局,支持窗口縮放,代碼編輯區(qū)域與行號區(qū)域同步滾動;
- 輕量級無依賴:基于 WPF 內(nèi)置
TextBox(或RichTextBox)實(shí)現(xiàn),無需引入第三方代碼編輯庫(如 AvalonEdit),降低項(xiàng)目耦合度。
二、開發(fā)環(huán)境與前置準(zhǔn)備
1. 開發(fā)環(huán)境
- 操作系統(tǒng):Windows 10/11
- 開發(fā)工具:Visual Studio 2022(或更高版本)
- 開發(fā)框架:.NET 6(或.NET 7/.NET 8,推薦長期支持版本)
- 核心技術(shù):WPF 布局控件、
RichTextBox控件(支持富文本著色)、C# 字符串處理、正則表達(dá)式(語法匹配)
2. 前置知識
- WPF 基礎(chǔ)布局(
Grid、ScrollViewer、StackPanel)的使用,實(shí)現(xiàn)行號與編輯區(qū)域的聯(lián)動; RichTextBox控件的核心操作,包括文本插入、選區(qū)獲取、段落格式設(shè)置、富文本著色;- 正則表達(dá)式基礎(chǔ),能夠匹配 C# 關(guān)鍵字、注釋、字符串等語法元素;
- C# 事件處理,掌握
KeyDown、TextChanged、ScrollChanged等事件的使用,實(shí)現(xiàn)編輯交互。
3. 項(xiàng)目創(chuàng)建
打開 Visual Studio 2022,創(chuàng)建一個(gè)新的「WPF 應(yīng)用 (.NET)」項(xiàng)目,命名為WpfCSharpCodeEditor,選擇對應(yīng)的.NET 框架版本,完成項(xiàng)目初始化。項(xiàng)目結(jié)構(gòu)保持簡潔,核心代碼集中在MainWindow.xaml(界面)和MainWindow.xaml.cs(邏輯)中,無需額外添加復(fù)雜依賴。
三、界面設(shè)計(jì)(XAML):打造輕量級代碼編輯界面
WPF 代碼編輯器的界面設(shè)計(jì)需兼顧實(shí)用性與簡潔性,本次采用「行號區(qū)域 + 代碼編輯區(qū)域」的左右布局,核心使用RichTextBox實(shí)現(xiàn)富文本編輯與語法高亮,通過ScrollViewer實(shí)現(xiàn)兩個(gè)區(qū)域的同步滾動,核心 XAML 代碼如下:
<Window
x:Class="WpfCSharpCodeEditor.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfCSharpCodeEditor"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="mainWindow"
Title="WPF簡單C#代碼編輯器"
Width="1000"
Height="700"
ResizeMode="CanResize"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Grid Margin="5">
<!-- 定義全局樣式,統(tǒng)一界面風(fēng)格 -->
<Grid.Resources>
<!-- 代碼編輯區(qū)域字體樣式 -->
<Style x:Key="CodeTextStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Consolas" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Foreground" Value="#FFFFFF" />
</Style>
<!-- 行號區(qū)域樣式 -->
<Style x:Key="LineNumberStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="Consolas" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Foreground" Value="#808080" />
<Setter Property="TextAlignment" Value="Right" />
<Setter Property="Padding" Value="0,0,5,0" />
</Style>
</Grid.Resources>
<!-- 核心布局:左右分欄(行號+代碼編輯) -->
<Grid.ColumnDefinitions>
<!-- 行號區(qū)域(固定寬度) -->
<ColumnDefinition Width="50" />
<!-- 代碼編輯區(qū)域(自適應(yīng)剩余寬度) -->
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- 1. 行號區(qū)域(帶滾動,與編輯區(qū)域同步) -->
<ScrollViewer
x:Name="ScrollLineNumber"
Grid.Column="0"
Background="#1E1E1E"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden">
<TextBlock
x:Name="TxtLineNumber"
Margin="5,2,5,2"
Style="{StaticResource LineNumberStyle}" />
</ScrollViewer>
<!-- 2. 代碼編輯區(qū)域(核心:移除外層ScrollViewer,優(yōu)化RichTextBox屬性) -->
<RichTextBox
x:Name="RtbCodeEditor"
Grid.Column="1"
Padding="5,2,5,2"
AcceptsReturn="True"
AcceptsTab="True"
Background="#1E1E1E"
BorderThickness="0"
FontFamily="Consolas"
FontSize="14"
Foreground="#FFFFFF"
HorizontalScrollBarVisibility="Auto"
KeyDown="RtbCodeEditor_KeyDown"
TextChanged="RtbCodeEditor_TextChanged"
VerticalScrollBarVisibility="Auto">
<FlowDocument
ColumnWidth="999999"
PagePadding="0"
PageWidth="{Binding ElementName=MainWindow, Path=ActualWidth}"
TextAlignment="Left">
<Paragraph Margin="0" LineHeight="20" />
</FlowDocument>
</RichTextBox>
</Grid>
</Window>界面設(shè)計(jì)說明
- 采用深色主題(背景
#1E1E1E),符合程序員的代碼編輯習(xí)慣,降低視覺疲勞; - 行號區(qū)域固定寬度,使用
TextBlock顯示行號,顏色為灰色(#808080),與代碼區(qū)域形成視覺區(qū)分; - 代碼編輯區(qū)域使用
RichTextBox,支持富文本著色(為后續(xù)語法高亮提供基礎(chǔ)),啟用AcceptsReturn和AcceptsTab,支持回車換行與 Tab 縮進(jìn); - 兩個(gè)區(qū)域均嵌套在
ScrollViewer中,通過ScrollChanged事件實(shí)現(xiàn)滾動同步,保證行號與代碼行一一對應(yīng); - 字體選用
Consolas(專業(yè)代碼字體),等寬顯示,提升代碼可讀性。
四、核心邏輯實(shí)現(xiàn)(C#):實(shí)現(xiàn)代碼編輯與語法高亮
界面搭建完成后,核心工作是實(shí)現(xiàn)行號更新、語法高亮、基礎(chǔ)編輯輔助等邏輯,所有代碼均在MainWindow.xaml.cs中實(shí)現(xiàn),確保邏輯簡潔、高效。
1. 定義全局常量與輔助變量
首先定義 C# 關(guān)鍵字常量(用于語法匹配)、顏色常量(用于差異化著色),以及輔助變量,提升代碼可維護(hù)性:
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfCSharpCodeEditor;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Input;
public partial class MainWindow : Window
{
// 常量:C#核心關(guān)鍵字(可根據(jù)需求擴(kuò)展)
private readonly HashSet<string> _csharpKeywords = new HashSet<string>
{
"using", "namespace", "class", "public", "private", "protected",
"static", "void", "int", "string", "bool", "double", "float",
"if", "else", "for", "foreach", "while", "do", "return",
"new", "this", "base", "try", "catch", "finally"
};
// 常量:語法著色顏色
private readonly SolidColorBrush _keywordBrush = new SolidColorBrush(Color.FromRgb(0, 122, 204)); // 藍(lán)色(關(guān)鍵字)
private readonly SolidColorBrush _commentBrush = new SolidColorBrush(Color.FromRgb(0, 128, 0)); // 綠色(注釋)
private readonly SolidColorBrush _stringBrush = new SolidColorBrush(Color.FromRgb(255, 165, 0)); // 橙色(字符串)
private readonly SolidColorBrush _defaultBrush = new SolidColorBrush(Color.FromRgb(255, 255, 255));// 白色(默認(rèn)文本)
// 輔助變量:標(biāo)記是否正在執(zhí)行語法高亮(避免TextChanged事件遞歸觸發(fā))
private bool _isHighlighting = false;
public MainWindow()
{
InitializeComponent();
// 初始化行號
UpdateLineNumbers();
// 初始化示例C#代碼
InitSampleCode();
}
/// <summary>
/// 初始化示例C#代碼
/// </summary>
private void InitSampleCode()
{
string sampleCode = @"using System;
namespace WpfCSharpCodeEditor
{
// 簡單C#代碼示例
public class SampleClass
{
public static void Main(string[] args)
{
// 輸出問候語
string message = ""Hello, WPF C# Code Editor!"";
Console.WriteLine(message);
// 簡單循環(huán)
for (int i = 0; i < 5; i++)
{
Console.WriteLine(""Loop index: "" + i);
}
}
}
}";
// 將示例代碼寫入RichTextBox
RtbCodeEditor.Document.Blocks.Clear();
Paragraph paragraph = new Paragraph();
paragraph.Inlines.Add(new Run(sampleCode));
RtbCodeEditor.Document.Blocks.Add(paragraph);
// 執(zhí)行首次語法高亮
HighlightCSharpSyntax();
// 更新行號
UpdateLineNumbers();
}
/// <summary>
/// 代碼編輯區(qū)域滾動事件(同步行號區(qū)域滾動,適配RichTextBox內(nèi)置滾動)
/// </summary>
private void RtbCodeEditor_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e.VerticalChange != 0)
{
ScrollLineNumber.ScrollToVerticalOffset(e.VerticalOffset);
}
}
/// <summary>
/// 更新行號顯示
/// </summary>
private void UpdateLineNumbers()
{
// 獲取代碼總行數(shù)
int lineCount = GetCodeLineCount();
// 構(gòu)建行號文本
StringBuilder lineNumberText = new StringBuilder();
for (int i = 1; i <= lineCount; i++)
{
lineNumberText.AppendLine(i.ToString());
}
// 賦值給行號TextBlock
TxtLineNumber.Text = lineNumberText.ToString();
}
/// <summary>
/// 獲取代碼總行數(shù)
/// </summary>
/// <returns>總行數(shù)</returns>
private int GetCodeLineCount()
{
// 從RichTextBox中提取文本并統(tǒng)計(jì)行數(shù)
TextRange textRange = new TextRange(RtbCodeEditor.Document.ContentStart, RtbCodeEditor.Document.ContentEnd);
string codeText = textRange.Text;
if (string.IsNullOrEmpty(codeText)) return 1;
// 統(tǒng)計(jì)換行符數(shù)量,總行數(shù)=換行符數(shù)+1
return codeText.Split(new[] { Environment.NewLine }, StringSplitOptions.None).Length;
}
/// <summary>
/// 代碼編輯區(qū)域滾動事件(同步行號區(qū)域滾動)
/// </summary>
private void ScrollCodeEditor_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e.VerticalChange != 0)
{
ScrollLineNumber.ScrollToVerticalOffset(e.VerticalOffset);
}
}
/// <summary>
/// C#語法高亮核心方法
/// </summary>
private void HighlightCSharpSyntax()
{
// 防止遞歸觸發(fā)(TextChanged事件中調(diào)用此方法,避免重復(fù)執(zhí)行)
if (_isHighlighting) return;
_isHighlighting = true;
try
{
// 1. 保存當(dāng)前光標(biāo)位置與選區(qū)(避免高亮后光標(biāo)丟失)
TextPointer caretPosition = RtbCodeEditor.CaretPosition;
TextRange selectionRange = new TextRange(RtbCodeEditor.Selection.Start, RtbCodeEditor.Selection.End);
bool hasSelection = !selectionRange.IsEmpty;
// 2. 提取完整代碼文本
TextRange fullTextRange = new TextRange(RtbCodeEditor.Document.ContentStart, RtbCodeEditor.Document.ContentEnd);
string codeText = fullTextRange.Text;
if (string.IsNullOrEmpty(codeText)) return;
// 3. 清空現(xiàn)有格式(保留文本內(nèi)容)
fullTextRange.ClearAllProperties();
// 4. 分步實(shí)現(xiàn)語法著色
// 4.1 匹配多行注釋 /* ... */
MatchCollection multiLineCommentMatches = Regex.Matches(codeText, @"/\*.*?\*/", RegexOptions.Singleline);
ApplyHighlightToMatches(multiLineCommentMatches, _commentBrush);
// 4.2 匹配單行注釋 // ...
MatchCollection singleLineCommentMatches = Regex.Matches(codeText, @"http://.*?$", RegexOptions.Multiline);
ApplyHighlightToMatches(singleLineCommentMatches, _commentBrush);
// 4.3 匹配字符串 ""...""
MatchCollection stringMatches = Regex.Matches(codeText, @"\""([^\""\\]|\\.)*\""", RegexOptions.Multiline);
ApplyHighlightToMatches(stringMatches, _stringBrush);
// 4.4 匹配C#關(guān)鍵字(邊界匹配,避免匹配到單詞中的子串)
string keywordPattern = @"\b(" + string.Join("|", _csharpKeywords) + @")\b";
MatchCollection keywordMatches = Regex.Matches(codeText, keywordPattern, RegexOptions.IgnoreCase);
ApplyHighlightToMatches(keywordMatches, _keywordBrush);
// 5. 恢復(fù)光標(biāo)位置與選區(qū)
RtbCodeEditor.CaretPosition = caretPosition;
if (hasSelection)
{
RtbCodeEditor.Selection.Select(selectionRange.Start, selectionRange.End);
}
}
catch (Exception ex)
{
MessageBox.Show($"語法高亮失?。簕ex.Message}", "錯(cuò)誤提示", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
_isHighlighting = false;
}
}
/// <summary>
/// 為匹配到的語法元素應(yīng)用著色
/// </summary>
/// <param name="matches">正則匹配結(jié)果集合</param>
/// <param name="brush">著色畫筆</param>
private void ApplyHighlightToMatches(MatchCollection matches, SolidColorBrush brush)
{
foreach (Match match in matches)
{
if (match.Success && match.Length > 0)
{
// 獲取匹配項(xiàng)的起始與結(jié)束位置對應(yīng)的TextPointer
TextPointer startPointer = GetTextPointerByOffset(match.Index);
TextPointer endPointer = GetTextPointerByOffset(match.Index + match.Length);
if (startPointer != null && endPointer != null)
{
TextRange matchRange = new TextRange(startPointer, endPointer);
// 應(yīng)用前景色
matchRange.ApplyPropertyValue(TextElement.ForegroundProperty, brush);
// 可選:設(shè)置粗體(關(guān)鍵字加粗)
if (brush == _keywordBrush)
{
matchRange.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
}
}
}
}
}
/// <summary>
/// 根據(jù)字符偏移量獲取對應(yīng)的TextPointer
/// </summary>
/// <param name="offset">字符偏移量</param>
/// <returns>對應(yīng)的TextPointer</returns>
private TextPointer GetTextPointerByOffset(int offset)
{
TextPointer start = RtbCodeEditor.Document.ContentStart;
int currentOffset = 0;
while (start != null && currentOffset < offset)
{
if (start.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
{
int textLength = start.GetTextRunLength(LogicalDirection.Forward);
if (currentOffset + textLength > offset)
{
return start.GetPositionAtOffset(offset - currentOffset);
}
currentOffset += textLength;
}
start = start.GetNextContextPosition(LogicalDirection.Forward);
}
return start;
}
/// <summary>
/// 代碼文本變化事件(更新行號+語法高亮)
/// </summary>
private void RtbCodeEditor_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
// 更新行號
UpdateLineNumbers();
// 執(zhí)行語法高亮
HighlightCSharpSyntax();
}
/// <summary>
/// 鍵盤按下事件(優(yōu)化編輯體驗(yàn):Tab縮進(jìn)、回車自動縮進(jìn))
/// </summary>
private void RtbCodeEditor_KeyDown(object sender, KeyEventArgs e)
{
// 1. Tab鍵:插入4個(gè)空格(代替默認(rèn)Tab字符,保持格式統(tǒng)一)
if (e.Key == Key.Tab)
{
// 取消默認(rèn)Tab行為
e.Handled = true;
// 插入4個(gè)空格作為縮進(jìn)
RtbCodeEditor.CaretPosition.InsertTextInRun(" ");
}
// 2. 回車鍵:自動縮進(jìn)(匹配上一行的縮進(jìn)格式)
if (e.Key == Key.Enter)
{
// 取消默認(rèn)回車行為(后續(xù)手動處理)
e.Handled = true;
// 獲取當(dāng)前行的縮進(jìn)字符串
string currentIndent = GetCurrentLineIndent();
// 插入回車+縮進(jìn)
RtbCodeEditor.CaretPosition.InsertTextInRun(Environment.NewLine + currentIndent);
// 調(diào)整光標(biāo)位置(保持在縮進(jìn)后)
RtbCodeEditor.CaretPosition = RtbCodeEditor.CaretPosition.GetPositionAtOffset(currentIndent.Length);
}
}
/// <summary>
/// 獲取當(dāng)前行的縮進(jìn)字符串(空格)
/// </summary>
/// <returns>縮進(jìn)字符串</returns>
private string GetCurrentLineIndent()
{
TextPointer caret = RtbCodeEditor.CaretPosition;
// 定位到當(dāng)前行的起始位置
TextPointer lineStart = caret.GetLineStartPosition(0);
if (lineStart == null) return string.Empty;
// 提取當(dāng)前行從起始到光標(biāo)位置的文本
TextRange lineRange = new TextRange(lineStart, caret);
string lineText = lineRange.Text;
// 提取前面的空格(縮進(jìn)部分)
StringBuilder indentBuilder = new StringBuilder();
foreach (char c in lineText)
{
if (c == ' ')
{
indentBuilder.Append(c);
}
else
{
break;
}
}
return indentBuilder.ToString();
}
}
五、程序測試與運(yùn)行
- 編譯項(xiàng)目:點(diǎn)擊 Visual Studio 中的「生成」按鈕,確保項(xiàng)目無編譯錯(cuò)誤,生成可執(zhí)行文件;
- 運(yùn)行程序:啟動生成的
WpfCSharpCodeEditor.exe,程序窗口將居中顯示,自動加載示例 C# 代碼并完成語法高亮; - 功能測試:
- 基礎(chǔ)編輯:輸入、刪除、復(fù)制、粘貼代碼,驗(yàn)證行號是否實(shí)時(shí)更新,光標(biāo)位置是否保持正常;
- 語法高亮:輸入 C# 關(guān)鍵字(如
if、for)、注釋(//、/* */)、字符串(""),驗(yàn)證是否能正確著色; - 編輯優(yōu)化:按下 Tab 鍵,驗(yàn)證是否插入 4 個(gè)空格;按下回車鍵,驗(yàn)證是否自動繼承上一行縮進(jìn);
- 滾動同步:滾動代碼編輯區(qū)域,驗(yàn)證行號區(qū)域是否同步滾動,行號與代碼行是否一一對應(yīng);
- 擴(kuò)展測試:手動刪除示例代碼,輸入自定義 C# 代碼,驗(yàn)證語法高亮的穩(wěn)定性與準(zhǔn)確性。
運(yùn)行效果:

六、功能擴(kuò)展與優(yōu)化建議
本次實(shí)現(xiàn)的簡單 C# 代碼編輯器已滿足基礎(chǔ)編輯需求,可根據(jù)實(shí)際場景進(jìn)行以下擴(kuò)展與優(yōu)化,使其更加強(qiáng)大:
- 擴(kuò)展語法支持:添加更多 C# 語法元素高亮(如運(yùn)算符、常量、泛型),支持VB.NET、Python 等其他編程語言;
- 高級編輯功能:添加代碼折疊(折疊命名空間、類、方法)、查找 / 替換、撤銷 / 重做(完善
RichTextBox的撤銷邏輯); - 格式優(yōu)化:添加代碼自動格式化(對齊大括號、調(diào)整縮進(jìn))、注釋格式化、快捷鍵支持(如
Ctrl+S保存、Ctrl+F查找); - 錯(cuò)誤提示:集成簡單的語法錯(cuò)誤檢測(如缺少分號、大括號不匹配),顯示錯(cuò)誤標(biāo)記與提示信息;
- 保存與打開:添加代碼文件(
.cs)的打開與保存功能,支持編碼格式選擇(UTF-8、GBK); - 界面優(yōu)化:添加深色 / 淺色主題切換、字體大小調(diào)整、行號高亮(當(dāng)前行),提升視覺體驗(yàn);
- 第三方控件集成:若需要更專業(yè)的功能,可集成 AvalonEdit、ICSharpCode.TextEditor 等成熟的代碼編輯控件,降低開發(fā)成本。
七、總結(jié)
本文基于 WPF 框架,無需第三方控件,完整實(shí)現(xiàn)了一款支持簡單 C# 代碼編輯的工具,核心亮點(diǎn)在于:
- 輕量級無依賴:基于 WPF 內(nèi)置
RichTextBox與正則表達(dá)式實(shí)現(xiàn),無需引入額外庫,部署簡單; - 核心功能完備:支持語法高亮、行號顯示、滾動同步、Tab 縮進(jìn)、回車自動縮進(jìn),滿足基礎(chǔ)代碼編輯需求;
- 界面友好:采用深色主題與等寬字體,符合程序員編輯習(xí)慣,支持窗口縮放適配;
- 邏輯可擴(kuò)展:語法高亮與編輯邏輯解耦,便于后續(xù)擴(kuò)展更多語法元素與高級功能。
通過本文的講解,不僅可以掌握 WPF 實(shí)現(xiàn)簡單代碼編輯器的方法,還能深入理解RichTextBox富文本操作、正則表達(dá)式語法匹配、WPF 控件聯(lián)動等核心知識點(diǎn)。在此基礎(chǔ)上,可根據(jù)實(shí)際需求進(jìn)行功能擴(kuò)展,開發(fā)出更貼合開發(fā)場景的輕量級代碼編輯工具。
以上就是基于WPF實(shí)現(xiàn)簡單C#代碼編輯功能的完整流程的詳細(xì)內(nèi)容,更多關(guān)于WPF實(shí)現(xiàn)C#代碼編輯功能的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c#實(shí)現(xiàn)將pdf轉(zhuǎn)文本的示例分享
這篇文章主要介紹了c#實(shí)現(xiàn)將pdf轉(zhuǎn)文本的示例,需要的朋友可以參考下2014-03-03
C# 調(diào)用 JavaWebservice服務(wù)遇到的問題匯總
本文給大家分享的是個(gè)人在使用C#調(diào)用 JavaWebservice服務(wù)遇到的幾個(gè)問題的解決方法的匯總,給有類似需求的小伙伴們參考下吧。2016-01-01
Unity Shader實(shí)現(xiàn)動態(tài)過場切換圖片效果
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)動態(tài)過場切換圖片效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
淺談C#中的for循環(huán)與foreach循環(huán)
本篇文章主要介紹了C#中的for循環(huán)與foreach循環(huán)的相關(guān)知識,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-05-05

