如何实现 WPF 代码查看器控件
如何实现 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]
地址:
评论