我想级联AvalonEdit的SyntaxHighlighting引擎.我有2个HighlightingDefinitions.第一个是主要语法.第二个是复杂的多行预处理器 - 标记语言.由于这个原因,在第一个语法中嵌入第二个语法太复杂了.更简单的方法是渲染第一种语法,然后更改受影响的线部分(基于第二种语法).
所以我HighlightingColorizer用第二语言实例化了一个新的并添加到了LineTransformers.但是第二种语言使整个文档着色,而不仅仅是具有预处理器指令的行部分:非预处理器代码是黑色的.
当我调试ColorizeLine第二行变换器的方法时,未突出显示的代码(=没有预处理器代码)的行未按预期进行着色.但线条的颜色是黑色.
那么HighlightingColorizer在开始着色之前重置所有先前突出显示的整个文档是什么?
或者还有什么问题呢?我怎样才能正确级联2 HighlightingColorizers?
我想在TextEditor我的MVVM应用程序中包含一个AvalonEdit 控件.我要求的第一件事是能够绑定到TextEditor.Text属性,以便我可以显示文本.为此,我遵循了Make AvalonEdit MVVM兼容的示例.现在,我已使用接受的答案作为模板实现了以下类
public sealed class MvvmTextEditor : TextEditor, INotifyPropertyChanged
{
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(MvvmTextEditor),
new PropertyMetadata((obj, args) =>
{
MvvmTextEditor target = (MvvmTextEditor)obj;
target.Text = (string)args.NewValue;
})
);
public new string Text
{
get { return base.Text; }
set { base.Text = value; }
}
protected override void OnTextChanged(EventArgs e)
{
RaisePropertyChanged("Text");
base.OnTextChanged(e);
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string info)
{
if (PropertyChanged != null) …Run Code Online (Sandbox Code Playgroud) 我正在尝试为AvalonEdit定义一些自定义突出显示规则.似乎没有任何相关的文档 - 有关于文件格式的一些文档,但没有关于如何在创建它之后实际加载和使用该定义的文档.
" 语法高亮 "维基页面(对于旧的WinForms TextEditor)记录了如何从磁盘上的.xshd文件加载突出显示定义,但我宁愿将其作为资源嵌入,就像AvalonEdit对其内置定义一样.
我查看了加载其内置荧光笔的ICSharpCode.AvalonEdit项目中的代码,但实际的"资源加载"代码是在DefaultHighlightingManager.LoadHighlighting中完成的,这是私有的 - 为了使事情变得怪异,显然只在发布版本中调用.
我可以不停地摸索,从私有方法中复制/粘贴一些代码,并尝试将可能或可能不起作用的东西拼凑在一起,但似乎值得问一下:这样做的标准方法是什么?是否有推荐的方法让第三方代码从资源加载突出显示定义?
Daniel的回答给了我一个良好的开端,但你需要在传递给GetManifestResourceStream的字符串中包含命名空间名称 - 如果不这样做,你将得到一个NullReferenceException(因为它返回一个空流).
我最后将一个名为ResourceLoader的静态类添加到与.xshd文件相同的项目文件夹中,使用此方法:
public static IHighlightingDefinition LoadHighlightingDefinition(
string resourceName)
{
var type = typeof(ResourceLoader);
var fullName = type.Namespace + "." + resourceName;
using (var stream = type.Assembly.GetManifestResourceStream(fullName))
using (var reader = new XmlTextReader(stream))
return HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
Run Code Online (Sandbox Code Playgroud)
然后我就可以打电话了ResourceLoader.LoadHighlightingDefinition("Name.xshd").
对于在家中跟随的任何人,.xshd文件需要将其Build Action设置为Embedded Resource.
我已经在互联网上看了(一遍又一遍),我找不到AvalonEdit的SQL.vshd文件,我使用了旧的格式版本,但它使编辑器出错(它根本不再显示) ,所以我想知道也许有人做过这样的文件,因为我不想浪费时间做这个,如果它已经完成了.
如果你可以与我分享你的赞赏:)
提前致谢
我正在尝试在我的WPF应用程序中使Avalon MVVM兼容.从谷歌搜索,我发现AvalonEdit不是MVVM友好的,我需要通过创建一个派生自TextEditor的类然后添加必要的依赖属性来导出AvalonEdit的状态.我担心Herr Grunwald 在这里的回答让我很失落:
如果你真的需要使用MVVM导出编辑器的状态,那么我建议你创建一个派生自TextEditor的类,它添加必要的依赖属性并将它们与AvalonEdit中的实际属性同步.
有没有人有一个例子或有关如何实现这一目标的好建议?
如何在WPF应用程序中使用单词编辑器?是否可以仅使用WPF中的Windows窗体托管?还有另一种方法可以实现吗?
我找到了AvalonEdit,但它没有我需要的功能.所以使用这种方式,我的问题可能无法解决.
还有一些东西在WPF中托管Windows窗体控件,但它不是我的答案.
我想知道有没有办法在wpf应用程序中以原生方式使用word编辑器?是否所有API都可以在该解决方案中使用?
提前致谢.
我知道,我必须用一个ElementHost显示在WinForm的WPF控件,但由于WPF控件是第三方软件,而且只配备了一个XML文件和DLL文件.
控件是AvalonEdit,我将两个ICSharpCode.AvalonEdit.xml和ICSharpCode.AvalonEdit.dll文件添加到我的项目中,然后我去了Project -> Add Reference并添加了DLL作为参考.现在我可以ICSharpCode在我的代码中访问命名空间,所有的类和方法都暴露出来,但从这一点来说,我不确定如何在我的WinForm中实际使用该控件.
我期待WPF控件出现在解决方案资源管理器中,但事实并非如此.我尝试将ElementHost控件添加到我的WinForm,但是当我尝试选择托管内容时,没有控件出现,所以它不知道我的WPF控件.如何在WinForm中使用AvalonEdit WPF控件?
我正在使用AvalonEdit,我希望用户始终能够看到插入符号所在的行,即使编辑器没有焦点.为此,我发现并修改了一些使用BackgroundRenderer突出显示当前行背景的代码.
不幸的是,如果我在编辑器未聚焦时更改了CaretOffset,那么我的背景矩形会保持不变,在编辑器失去焦点的当前行上.在编辑器再次获得焦点之前,它不会同步到新的当前行.
我弄清楚为什么会发生这种情况(只是没有解决方法).根据IBackgroundRenderer的文档注释,"背景渲染器将仅在其关联的已知图层选择绘制它们时绘制.例如,当插入符号被隐藏时,插入符层中的背景渲染器将不可见." 我的背景渲染器存在于KnownLayer.Caret上,所以是的,我知道为什么当编辑器没有聚焦时它没有更新 - 这是因为插入符也被隐藏了.(鉴于此,我真的很惊讶我的矩形保持可见.)
我在设置CaretOffset后立即尝试显式调用textEditor.TextArea.TextView.InvalidateLayer(KnownLayer.Caret),但这没有效果 - 我猜这个调用被忽略了,因为插入符被隐藏了.
即使编辑器没有焦点,强制当前行高亮显示更新的最佳方法是什么?
这是我班级的代码.如果有更好的方法,我当然愿意放弃这种做法并采取不同的方法.
public class HighlightCurrentLineBackgroundRenderer : IBackgroundRenderer
{
private TextEditor _editor;
public HighlightCurrentLineBackgroundRenderer(TextEditor editor)
{
_editor = editor;
}
public KnownLayer Layer
{
get { return KnownLayer.Caret; }
}
public void Draw(TextView textView, DrawingContext drawingContext)
{
if (_editor.Document == null)
return;
textView.EnsureVisualLines();
var currentLine = _editor.Document.GetLineByOffset(_editor.CaretOffset);
foreach (var rect in BackgroundGeometryBuilder.GetRectsForSegment(textView, currentLine))
{
drawingContext.DrawRectangle(
new SolidColorBrush(Color.FromArgb(0x40, 0, 0, 0xFF)), null,
new Rect(rect.Location, new Size(textView.ActualWidth - 32, rect.Height)));
}
} …Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,其中包括为我的WPF(.Net4)Windows应用程序实现脚本接口.我很好奇是否有人可以建议一个首选的编辑器,AvalonEdit vs ScintillaNET.一个人的任何陷阱和优势.我们需要支持C#和IronPython作为脚本语言.(至少这是最初的计划.我们可能最终确定其中一个).
ScintillaNET的一个缺点是它只是一个围绕本机(非托管)Scintilla的托管包装器.当与WPF4一起使用时,这是否会导致任何问题.
任何指针和建议都表示赞赏.
我用AvalonEdit:TextEditor.我可以为此控件启用快速搜索对话框(例如在Ctrl-F上)吗?或者也许有人将搜索词的代码转换为 AvalonEdit:TextEditor文本?