WPF之AvalonEdit实现MVVM双向绑定

AvalonEdit简介

AvalonEdit是基于WPF开发的代码显示控件,默认支持多种不同语言的关键词高亮,并且可以自定义高亮配置。所以通过AvalonEdit可以快速开发出自己想要的代码编辑器。

通过Nuget安装AvalonEdit,并在页面添加控件

 <avalonEdit:TextEditor
                        xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"
                        Name="TextEditor"
                        SyntaxHighlighting="C#"
                        FontFamily="Consolas"
                        FontSize="14"
                        WordWrap ="True"
                        LineNumbersForeground="#FF2B91AF"
                        ShowLineNumbers="True">
     <avalonEdit:TextEditor.Options>
         <avalonEdit:TextEditorOptions ShowSpaces="True" WordWrapIndentation="4" InheritWordWrapIndentation="true">
             <avalonEdit:TextEditorOptions.ColumnRulerPosition>
                 <system:Int32>10</system:Int32>
             </avalonEdit:TextEditorOptions.ColumnRulerPosition>
         </avalonEdit:TextEditorOptions>
     </avalonEdit:TextEditor.Options>
</avalonEdit:TextEditor>

参数含义

  • xmlns:avalonEdit:命名空间,也可以直接写在调用该控件的窗体内
  • SyntaxHighlighting:设置高亮
  • ShowLineNumbers:是否显示行号
  • LineNumbersForeground:设置编辑器行号颜色
  • ShowSpaces:是否显示空格
  • WordWrapIndentation:换行缩进距离
  • InheritWordWrapIndentation:是否继承上一行的换行缩进
自定义高亮配置

比如AvalonEdit默认支持的sql语法高亮不够强大或者不符合要求,可以自定义配置注册进行。

首先,在项目中引入一个.xshd文件,具体规则可以参考官网介绍。这里提供一个sql.xshd文件,描述了对SQL语法的高亮支持。

在程序启动的时候读取该配置文件,并注册到AvalonEdit中。

using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + ".sql.xshd"))
{
    using (var reader = new System.Xml.XmlTextReader(stream))
    {
        var sqlDefinition = HighlightingLoader.Load(reader, HighlightingManager.Instance);
        HighlightingManager.Instance.RegisterHighlighting("SQL", new string[] { ".sql" }, sqlDefinition);
	}
}

ps:这里是将sql.xshd的生成操作设置为了嵌入的资源,也可以将其输出到目录再读取内容。

如果需要在项目运行过程中,切换高亮语法支持,可以这么做

textEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("SQL");

看下高亮效果:

MVVM绑定AvalonEdit文本内容

当我尝试直接将ViewModel中的字符串直接绑定到Text上时,编辑器就报错了,因为Text属性并不是可以直接绑定的依赖属性。

Object of type 'System.Windows.Data.Binding' cannot be converted to type 'System.String'.

最后鼓捣一通后的解决方案是使用Microsoft.Xaml.Behaviors包(其实是微软以前System.Windows.Interactivity的开源版)。

xaml代码

<avalonEdit:TextEditor Name="TextEditor">
    <i:Interaction.Behaviors>
        <local:AvalonEditBehaviour InputText="{Binding InputString}"/>
    </i:Interaction.Behaviors>
</avalonEdit:TextEditor>

后端代码

public sealed class AvalonEditBehaviour : Behavior<TextEditor>
{
    public static readonly DependencyProperty InputTextProperty =
        DependencyProperty.Register("InputText", typeof(string), typeof(AvalonEditBehaviour),
        new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null));

    public string InputText
    {
        get { return (string)GetValue(InputTextProperty); }
        set { SetValue(InputTextProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        if (AssociatedObject != null)
        {
            AssociatedObject.TextChanged += AssociatedObjectOnTextChanged;
        }
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        if (AssociatedObject != null)
        {
            AssociatedObject.TextChanged -= AssociatedObjectOnTextChanged;
        }
    }

    private void AssociatedObjectOnTextChanged(object sender, EventArgs eventArgs)
    {
        var textEditor = sender as TextEditor;
        if (textEditor != null)
        {
            if (textEditor.Document != null)
            {
                InputText = textEditor.Document.Text;
            }
        }
    }
}

最后看一下实际效果吧

项目Demohttps://github.com/fxhui/DatabaseManagement

推荐这些文章:

WPF MVVM使用mvvmlight感觉好啰嗦

问题
1.写一个命令处理函数要写一大堆的花花架子,例如

1 public ICommand WindowCloseCommand
2 {
3 get
4 {
5 return new RelayCommand(() =>
6 {
7 //这里才是自己的代码,外面嵌套的太罗嗦了
8 }
9 );...

浅写一下MVC,MVP,MVVM三种模式的理解

M----封装和处理数据的
V----展示数据的
C----处理服务器请求和业务逻辑的
mvc的好处:强调责任分离,降低耦合性,方便维护代码
mvc的缺点:单向联系,需要被迫写许多代码,分层比较鸡肋,c层过于单薄
 
M----封装和处理数据的
V----展示数据的
P----中间人,可对两边进行双向传递
mvp的好处:增强了灵活性
mvp的缺点:p层要做的事情太多,过于臃肿,难以维护
 
M----封装和处理数据的
V----展示数据的
VM----视图与数据转换用的
mvvm的好处:通过双向数据绑定的方式,保持view与model的松耦合同时,减少了维护M与V之间关系...

asp.net中的<%#%> 和<%=%>的用法

问题
求指教她们俩的区别,什么时候该用什么,谢谢

最佳回答
#:是数据绑定用。
=:是直接输出用。

...

Repeater绑定数据后如何生成分组的数据,比较难这个问题。

问题
Repeater 绑定数据后如何生成这样的数据<ul><li>1</li><li>2</li><li>3</li></ul><ul><li>4</li><li>5</li><li>6</li></ul>每隔三条数据就生成新的UL数据的数量可能是1,6,7。。。不一定的。如果是7条数据的话就生成<ul><li>1</li><li>...

Vue学习四、使用双向数据绑定实现表单操作

使用原生的javaScript 获取节点值,和使用ref获取节点值

<template>
<div>
<ul>
<li>
姓名:<input type="text" id="name" />
</li>
<li>
年龄:<input type="text" ref="age" />
</li>
</ul>
<input type="button" value...

Mapstruct使用时报Unknown property xxx in result type xxx. Did you mean null?

0.背景
使用mapstruct时出现:

Unknown property "xxx" in result type xxx. Did you mean "null"?

同时,项目中也用到了lombok。
mapstruct版本: 1.4.1.Final
lombok版本: 1.8.22 (继承的Spring2.5.6)
<!-- mapstruct START-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</a...

SQL里有datetime字段的数据怎么比较

问题
<table border="0">
<tbody>
<tr>
<td>
<p>dt(字段名,类型为datetime)</p>
<p>2008-5-11 20:05:02</p>
</td>
</tr>
<tr>
<td>2008-5-11 20:08:09</td>
</tr>
<tr>
<td>2008-5-11 23:35:5...

MVVM WPF View的List控件怎样绑定到ViewModel的一个自定义的集合属性

问题

 小弟初学MVVM,尝试运用在WPF项目中。在ViewModel里自定义了一个集合属性
private ObservableCollection<User> checkUserList; public ObservableCollection<User> CheckUserList { get { if (checkUserList == null) { checkUserList = new ObservableCollection<User>(); } return checkUserList; } set { ...

界面控件DevExpress WPF入门指南 - 如何支持MVVM

DevExpress WPF v21.2高速下载
DevExpress WPF产品套件包括一个框架和一组 UI 控件,允许您开发 MVVM 应用程序。
Model-View-ViewModel (MVVM) 架构设计模式将您的应用程序分为三层。
Model
数据和业务逻辑。
View
定义 UI 布局并将单个元素绑定到 ViewModel 的属性和命令的标记。
ViewModel
连接视图和模型的逻辑。

您对图层所做的更改不会影响其他图层,因此开发人员和设计人员可以独立工作。
MVVM 框架
DevExpress WPF MVVM 框架包含代码生成器、转换器、异步命令和其他功能,...

Maven <build>

1. <build>

1.1 <resources>

编译保留 *.propertie s,*.xml

1.2 <plugins>

拷贝config目录
Java 1.8 编译
一般打包(无Spring)
Spring 打包

2. <properties>

编码 编译版本

1. <build>
1.1 <resources>
编译保留 *.propertie s,*.xml
<resource>
<directory>src/main/java</dire...

文章标题:WPF之AvalonEdit实现MVVM双向绑定
文章链接:https://www.dianjilingqu.com/308.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>