如何实现 WPF 代码查看器控件

Connor 火币app 2023-01-05 130 0

如何实现 WPF 代码查看器控件

CodeViewer

作者:WPFDevelopersOrg - 驚鏵

原文链接[1] :

CodeViewer

作者:WPFDevelopersOrg - 驚鏵

原文链接[1] :

框架使用 .NET40 ;

Visual Studio 2019 ;

代码展示需要使用到 AvalonEdit 是基于 WPF 的代码显示控件,项目 地址[2] ,支持 C# , java , C++ , XML , HTML , Java 等语言的关键字高亮显示如何查看美股

AvalonEdit 也是支持自定义的高亮配置,对于需要编写脚本编辑器的场景非常适用如何查看美股

可通过配置 CustomHighlighting.xshd 文件,可以对高亮显示做自定义设置如何查看美股

以下能够实现 ifelse 高亮格式设置如何查看美股,代码如下:

框架使用 .NET40 ;

Visual Studio 2019 ;

代码展示需要使用到 AvalonEdit 是基于 WPF 的代码显示控件,项目 地址[2] ,支持 C# , java , C++ , XML , HTML , Java 等语言的关键字高亮显示如何查看美股

AvalonEdit 也是支持自定义的高亮配置,对于需要编写脚本编辑器的场景非常适用如何查看美股

可通过配置 CustomHighlighting.xshd 文件,可以对高亮显示做自定义设置如何查看美股

以下能够实现 ifelse 高亮格式设置如何查看美股,代码如下:

< SyntaxDefinitionname= "Custom Highlighting"xmlns= ";

展开全文

< RuleSet>

< KeywordsfontWeight= "bold"foreground= "Blue">

< Word> if </ Word>

< Word> else </ Word>

</ Keywords>

</ RuleSet>

</ SyntaxDefinition>

1)新建 SourceCodeModel.cs 用作记录代码源码地址源码类型等如何查看美股

namespaceWPFDevelopers.Samples.Controls

publicclassSourceCodeModel

publicCodeType CodeType { get; set; }

publicstringHaader { get; set; }

publicstringCodeSource { get; set; }

publicenumCodeType

Xaml,

CSharp,

2)新建 CodeViewer.xaml 代码如下:

< ResourceDictionaryxmlns= ""

xmlns:x= ""

xmlns:controls= "clr-namespace:WPFDevelopers.Samples.Controls">

< StyleTargetType= "{x:Type controls:CodeViewer}">

< SetterProperty= "FontSize"Value= "{StaticResource NormalFontSize}"/>

< SetterProperty= "Template">

< Setter.Value>

< ControlTemplateTargetType= "{x:Type controls:CodeViewer}">

< TabControlx:Name= "PART_TabControl">

< TabControl.Resources>

< StyleTargetType= "TabPanel">

< SetterProperty= "HorizontalAlignment"Value= "Right"/>

</ Style>

</ TabControl.Resources>

< TabItemx:Name= "PART_TabItemContent"Header= "Sample"Content= "{TemplateBinding Content}"/>

</ TabControl>

< ControlTemplate.Triggers>

< TriggerProperty= "Content"Value= "{x:Null}">

< SetterProperty= "Visibility"TargetName= "PART_TabItemContent"Value= "Collapsed"/>

< SetterProperty= "SelectedIndex"TargetName= "PART_TabControl"Value= "1"/>

</ Trigger>

</ ControlTemplate.Triggers>

</ ControlTemplate>

</ Setter.Value>

</ Setter>

</ Style>

</ ResourceDictionary>

3)新建 CodeViewer.cs 继承 ContentControl 代码如下:

Content 用来展示控件如何查看美股

增加公共集合属性用做存放代码信息 SourceCodes ,重写控件时循环 SourceCodes 增加 TabItem 到 PART_TabControl 中如何查看美股

Content 用来展示控件如何查看美股

增加公共集合属性用做存放代码信息 SourceCodes ,重写控件时循环 SourceCodes 增加 TabItem 到 PART_TabControl 中如何查看美股

usingICSharpCode.AvalonEdit.Editing;

usingICSharpCode.AvalonEdit.Highlighting;

usingSystem;

usingSystem.Collections.ObjectModel;

usingSystem.IO;

usingSystem.Windows;

usingSystem.Windows.Controls;

usingstaticSystem.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;

namespaceWPFDevelopers.Samples.Controls

[ TemplatePart(Name = TabControlTemplateName, Type = typeof(TabControl))]

publicclassCodeViewer: ContentControl

privatestaticreadonlyType _typeofSelf = typeof(CodeViewer);

publicObservableCollection<SourceCodeModel> SourceCodes { get; } = newObservableCollection<SourceCodeModel>;

privateconststringTabControlTemplateName = "PART_TabControl";

privateTabControl _tabControl = null;

staticCodeViewer( )

DefaultStyleKeyProperty.OverrideMetadata(_typeofSelf,

newFrameworkPropertyMetadata(_typeofSelf));

publicoverridevoidOnApplyTemplate( )

base.OnApplyTemplate;

_tabControl = GetTemplateChild(TabControlTemplateName) asTabControl;

foreach( varitem inSourceCodes)

vartabItem = CreateTabItem(item);

_tabControl.Items.Add(tabItem);

TabItem CreateTabItem( SourceCodeModel codeModel)

if(codeModel== null) returnnull;

varpartTextEditor = newTextEditor;

partTextEditor.Options = newTextEditorOptions { ConvertTabsToSpaces = true};

partTextEditor.TextArea.SelectionCornerRadius = 0;

partTextEditor.SetResourceReference(TextArea.SelectionBrushProperty, "WindowBorderBrushSolidColorBrush");

partTextEditor.TextArea.SelectionBorder = null;

partTextEditor.TextArea.SelectionForeground = null;

partTextEditor.IsReadOnly = false;

partTextEditor.ShowLineNumbers = true;

partTextEditor.FontFamily = DrawingContextHelper.FontFamily;

partTextEditor.Text = GetCodeText(codeModel.CodeSource);

vartabItem = newTabItem

Content = partTextEditor

switch(codeModel.CodeType)

caseCodeType.Xaml:

partTextEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension( ".XML");

tabItem.Header = codeModel.Haader == null? "Xaml": codeModel.Haader;

break;

caseCodeType.CSharp:

partTextEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension( ".CS");

tabItem.Header = codeModel.Haader == null? "CSharp": codeModel.Haader;

break;

returntabItem;

stringGetCodeText( stringcodeSource )

varcode = string.Empty;

varuri = newUri(codeSource, UriKind.Relative);

varresourceStream = Application.GetResourceStream(uri);

if(resourceStream != null)

varstreamReader = newStreamReader(resourceStream.Stream);

code = streamReader.ReadToEnd;

returncode;

returncode;

4)新建 WPFDevelopers.SamplesCode.csproj 项目如何查看美股,在 VS 右键项目添加 现有项目 将所需要读取的代码文件添加为 链接 就能得到以下地址:

< ResourceInclude= "..\WPFDevelopers.Samples\ExampleViews\AnimationNavigationBar3DExample.xaml">

< Link> ExampleViews\AnimationNavigationBar3DExample.xaml </ Link>

</ Resource>

4)修改 Example 代码如下:

< UserControlx:Class= "WPFDevelopers.Samples.ExampleViews.AnimationNavigationBar3DExample"

xmlns= ""

xmlns:x= ""

xmlns:mc= ""

xmlns:d= ""

xmlns:wpfdev= ""

xmlns:controls= "clr-namespace:WPFDevelopers.Samples.Controls"

xmlns:local= "clr-namespace:WPFDevelopers.Samples.ExampleViews"

mc:Ignorable= "d"

d:DesignHeight= "450"d:DesignWidth= "800">

< controls:CodeViewer>

<!--此处放展示控件-->

< controls:CodeViewer.SourceCodes>

< controls:SourceCodeModel

CodeSource= "/WPFDevelopers.SamplesCode;component/ExampleViews/AnimationNavigationBar3DExample.xaml"

CodeType= "Xaml"/>

< controls:SourceCodeModel

CodeSource= "/WPFDevelopers.SamplesCode;component/ExampleViews/AnimationNavigationBar3DExample.xaml.cs"

CodeType= "CSharp"/>

</ controls:CodeViewer.SourceCodes>

</ controls:CodeViewer>

</ UserControl>

参考资料

[1]

原文链接:

[2]

地址:

评论