- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在努力使 Avalon MVVM 在我的 WPF 应用程序中兼容。通过谷歌搜索,我发现 AvalonEdit is not MVVM friendly我需要通过创建一个从 TextEditor 派生的类然后添加必要的依赖属性来导出 AvalonEdit 的状态。恐怕我对 Herr Grunwald 的回答很迷茫 here :
If you really need to export the state of the editor using MVVM, then I suggest you create a class deriving from TextEditor which adds the necessary dependency properties and synchronizes them with the actual properties in AvalonEdit.
有没有人有关于如何实现这一目标的示例或好的建议?
最佳答案
Herr Grunwald 正在谈论用 dependency properties 包装 TextEditor
属性,以便您可以绑定(bind)到它们。基本思路是这样的(例如使用 CaretOffset 属性):
public class MvvmTextEditor : TextEditor, INotifyPropertyChanged
{
public static DependencyProperty CaretOffsetProperty =
DependencyProperty.Register("CaretOffset", typeof(int), typeof(MvvmTextEditor),
// binding changed callback: set value of underlying property
new PropertyMetadata((obj, args) =>
{
MvvmTextEditor target = (MvvmTextEditor)obj;
target.CaretOffset = (int)args.NewValue;
})
);
public new string Text
{
get { return base.Text; }
set { base.Text = value; }
}
public new int CaretOffset
{
get { return base.CaretOffset; }
set { base.CaretOffset = value; }
}
public int Length { get { return base.Text.Length; } }
protected override void OnTextChanged(EventArgs e)
{
RaisePropertyChanged("Length");
base.OnTextChanged(e);
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
既然 CaretOffset
已经被包装在 DependencyProperty 中,您可以将它绑定(bind)到一个属性,比如 View 模型中的 Offset
。例如,将 Slider
控件的值绑定(bind)到相同的 View 模型属性 Offset
,并看到当您移动 Slider 时,Avalon 编辑器的光标位置得到更新:
<Window x:Class="AvalonDemo.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"
xmlns:avalonExt="clr-namespace:WpfTest.AvalonExt"
DataContext="{Binding RelativeSource={RelativeSource Self},Path=ViewModel}">
<StackPanel>
<avalonExt:MvvmTextEditor Text="Hello World" CaretOffset="{Binding Offset}" x:Name="editor" />
<Slider Minimum="0" Maximum="{Binding ElementName=editor,Path=Length,Mode=OneWay}"
Value="{Binding Offset}" />
<TextBlock Text="{Binding Path=Offset,StringFormat='Caret Position is {0}'}" />
<TextBlock Text="{Binding Path=Length,ElementName=editor,StringFormat='Length is {0}'}" />
</StackPanel>
</Window>
namespace AvalonDemo
{
public partial class TestWindow : Window
{
public AvalonTestModel ViewModel { get; set; }
public TestWindow()
{
ViewModel = new AvalonTestModel();
InitializeComponent();
}
}
}
public class AvalonTestModel : INotifyPropertyChanged
{
private int _offset;
public int Offset
{
get { return _offset; }
set
{
_offset = value;
RaisePropertyChanged("Offset");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
关于c# - 使 AvalonEdit MVVM 兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12344367/
我想在双击鼠标时突出显示所选单词的所有出现。这个问题Highlight all occurrences of selected word in AvalonEdit确实回答了如何使用 Document
我在使用AvalonEdit控件,而xshd-ruleset(对于tex)有一个小问题: 原始文件“ Mike Krueger的TeX文档2001的语法定义(由Jedit搜集)”中有关于特殊关键字的部
有没有办法在 AvalonEdit 文本编辑器中捕获粘贴事件,以便可以修改数据? 我们让用户粘贴 Excel 中的数据,并且出于某种原因,数据显示时带有一个额外的换行符。这意味着如果他们在块选择时粘贴
当我使用 avalonedit 开发自定义语言 IDE 时,我遇到了一个问题。我使用正则表达式来检查语法,它按设计工作。但是,我想用波浪文本标记显示语法错误。我确实在 google 上搜索过,但该解决
我无法将字符插入到我的 AvalonEdit TextEditor 中。 void editor_TextArea_TextEntered(object sender, TextComposition
实际上这是在 http://community.sharpdevelop.net/forums/p/21949/56153.aspx#56153 上被问到的但还没有答案 - 所以我在这里试试。 我在
如何检查某个位置的单词是否在 xshd-ruleset 的 Span[i] 中? 谢谢! 最佳答案 有两种可能的方式从高亮引擎获取信息: 突出显示引擎仅在每行的开头存储“跨度堆栈”。您可以使用 Doc
对于 AvalonEdit,我在 xshd 文件中定义了“注释”。现在,在我的程序中,我想确定给定的偏移量是在注释内部还是外部。 我确实在网上找到了一些代码,即: http://community.s
我正在使用 AvalonEdit 为补丁文件创建一个 View ,我想让它在整行中突出显示差异,而不仅仅是文本背景 - 类似于 GitHub for Windows 今天所做的: 我是 AvalonE
我尝试获取 avalonedit 控件的可见文本,但 VisualLines[] 仅使用 TextLines[] 处理自动换行,我不知道如何检查是否TextLine是否在可见区域。 如果我可以在 Te
我有一种简单的“语言”(类似于模板语言和简单的标记语言,如 BBcode — 基本上它只是带有一些变量、标签和类似功能的普通文本),我想强调它的语法。 这是我坚持的事情。 有变量,它们用$ 符号括起来
我目前将以下代码用作带有 AvalonEdit TextEditor 的 LineTransformer。我希望能够通过选择突出显示当前的单个搜索结果,但是该选择几乎不可见,因为 DocumentCo
我在让 AvalonEdit TextEditor 滚动到特定行时遇到了很多麻烦。 ScrollTo() 的行为只是滚动直到该行位于 View 中间。我尝试了很多在互联网上找到的不同方法,所以喜欢用
在 Avalonedit 中,如何获取用户可见的最顶行的行号? 我相信我应该使用 VisualLines,但它没有帮助。 最佳答案 您可以使用GetDocumentLineByVisualTop: i
有没有简单的方法使用 Avalon edit 来突出显示匹配的括号和其他字符,如 {}""? 最佳答案 AvalonEdit 无法自行完成 - 您必须自己编写该功能。 您必须自己找到匹配的括号(如果您
我正在使用 AvalonEdit,我希望用户始终能够看到插入符在哪一行,即使编辑器没有焦点。为此,我找到并改编了一些代码,这些代码使用 BackgroundRenderer 来突出显示当前行的背景。
我想实现一些在提供文档行时以编程方式更改文本背景的东西。(看起来非常类似于文本的 block 选择的东西。我将使用它来调试 IDE 的断点我在设计)。我不想使用选择,因为它会导致文本框滚动。 我想我需
我已将派生自 DocumentColorizingTransformer 的 LineTransformerClass 添加到 TextEditor: TxtEditCodeViewer.TextAr
我想在我的代码中更改 AvalonEdit 的语法突出显示。 XAML: C#: public string syntaxHighlighting { get; set; } public Mai
我想级联 AvalonEdit 的 SyntaxHighlighting Engine。我有 2 个 HighlightingDefinitions。第一个是主要语法。第二个是复杂的多行预处理器标记语
我是一名优秀的程序员,十分优秀!