- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 AvalonEdit 编写电影脚本编辑器。
我扩展了 DocumentLine 类,使其具有“Type”属性,其值代表“Character”、“Dialog Line”等。
我希望脚本中某种类型的文档行以大写形式书写(例如字符名称)。
渲染管道中是否有一个扩展点允许我获取文档行并更改它的大小写?
我尝试创建一个扩展 DocumentColorizingTransformer 的类,但在“protected override void ColorizeLine(DocumentLine line)”方法中更改大小写不起作用。
最佳答案
这很难,因为大写会改变显示字符和文档之间的映射(视觉列与文档偏移量)。
例如,单个字符“ß”(德语升号 s)仅作为小写字母存在,并在调用 string.ToUpper()
时转换为双字符字符串“SS” .编辑此文本很棘手:我们不能允许用户仅替换其中一个“S”,因为基础文档仅包含“ß”。
一个简单的解决方案是使用 char.ToUpper()
方法,在原始字符和大写字符之间强制执行一对一映射。这将使 'ß' 等字母保持不变。
在 AvalonEdit 4.2 中,在已经生成的 VisualLineElements 上只允许进行两种转换:
ChangeLinePart()
内部使用以便可以更改文本部分的属性。这意味着不可能在着色器中进行文本替换,您需要使用 VisualLineElementGenerator
来实现它.
/// <summary>
/// Makes all text after a colon (until the end of line) upper-case.
/// </summary>
public class UppercaseGenerator : VisualLineElementGenerator
{
public override int GetFirstInterestedOffset(int startOffset)
{
TextDocument document = CurrentContext.Document;
int endOffset = CurrentContext.VisualLine.LastDocumentLine.EndOffset;
for (int i = startOffset; i < endOffset; i++) {
char c = document.GetCharAt(i);
if (c == ':')
return i + 1;
}
return -1;
}
public override VisualLineElement ConstructElement(int offset)
{
DocumentLine line = CurrentContext.Document.GetLineByOffset(offset);
return new UppercaseText(CurrentContext.VisualLine, line.EndOffset - offset);
}
/// <summary>
/// Displays a portion of the document text, but upper-cased.
/// </summary>
class UppercaseText : VisualLineText
{
public UppercaseText(VisualLine parentVisualLine, int length) : base(parentVisualLine, length)
{
}
protected override VisualLineText CreateInstance(int length)
{
return new UppercaseText(ParentVisualLine, length);
}
public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context)
{
if (context == null)
throw new ArgumentNullException("context");
int relativeOffset = startVisualColumn - VisualColumn;
StringSegment text = context.GetText(context.VisualLine.FirstDocumentLine.Offset + RelativeTextOffset + relativeOffset, DocumentLength - relativeOffset);
char[] uppercase = new char[text.Count];
for (int i = 0; i < text.Count; i++) {
uppercase[i] = char.ToUpper(text.Text[text.Offset + i]);
}
return new TextCharacters(uppercase, 0, uppercase.Length, this.TextRunProperties);
}
}
}
在 AvalonEdit 4.3.0.8868 中,我添加了方法 VisualLine.ReplaceElement()
.这可用于替换默认的 VisualText
带有 UppercaseText
的元素线路变压器(着色器)中的元素。
请注意,还可以实现对“ß”显示为“SS”的支持。为此,您必须实现自己的 VisualLineText
副本。而不是仅仅覆盖现有的。然后您可以使用不同于文档长度的视觉长度。 GetRelativeOffset
和 GetVisualColumns
方法将用于提供文档和视觉坐标之间的映射。
您可以使用另一种选择:小型大写字母。
// in the colorizer:
ChangeLinePart(start, end, e => e.TextRunProperties.SetTypographyProperties(new CapsTypography()));
// helper class
class CapsTypography : DefaultTextRunTypographyProperties
{
public override FontCapitals Capitals {
get { return FontCapitals.SmallCaps; }
}
}
但是,WPF 只有在使用支持它们的 OpenType 字体时才会呈现小型大写字母。在我的测试中,Cambria
使用小型大写字母,大多数其他字体不使用。此外,SetTypographyProperties
方法和DefaultTextRunTypographyProperties
类需要 AvalonEdit 4.3。
关于c# - Avalon 中的大写编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11487234/
我使用的是Avalon 文本编辑器,并且向上键和向下键的光标位置没有改变。谁能建议我如何克服这个问题? 针对左右键导航,光标位置会正确更改。 我还检查了按键事件中插入符号的值,并且它不会因向上和向下按
我正在使用 AvalonEdit 编写电影脚本编辑器。 我扩展了 DocumentLine 类,使其具有“Type”属性,其值代表“Character”、“Dialog Line”等。 我希望脚本中某
我正在为一个评估项目工作,我需要能够将数据写入 avalon 从属模块,以便从运行在 DE0 板上的 nios 系统上的 2 个不同输入中选择数据。经过多番努力,我一直无法将数据从运行在 nios 核
我正在使用 AvalonDock 2.0 作为选项卡控件管理器,但是我还没有找到允许多行选项卡(需要时)的方法,或者显示后台隐藏选项卡的方法。 多行tab可以通过模板或者样式实现吗?还是我错过了一些我
我知道如果您处理编辑器的 PreviewKeyDown 事件然后将 KeyEventArgs 的 e.Handled 设置为 true,则可以完全禁用输入。 但是,我想弄清楚如何防止文档文本在修改后更
我在使用 Avalon Docking 时遇到问题,我的第二个面板停靠在底部并设置为“自动隐藏”。当 UI 运行时, Pane 默认加载为“停靠/可见”。我想将其隐藏/最小化。
我使用 Daniel Grünwald 的 BraceFoldingStrategy: public IEnumerable CreateNewFoldings(ITextSource documen
外部资源:http://www.codeproject.com/Articles/42490/Using-AvalonEdit-WPF-Text-Editor 我正在使用编辑器来显示日志文件,并希望它
我正在使用 avalon edit 编写一个自定义软件,我正在寻找一种方法来使行之间的空间(高度)更大。目前,每次用户结束写一行并想写另一行时,我都被迫添加一个空行。 我已经开始研究 TextView
我以这种方式在代码中创建面板: DockableContent dockableContent = CreateDockableContent(model); dockableContent.Show
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个 AvalonDock DockingManager 控件,其中包含一些子 anchor (无文档)。如果这些 anchor 从主 DockingManager float ,我知道它们仍然是
我在我的 WPF 应用程序中使用 Avalon。我想要一个类似于 Visual Studio 的窗口,左边是工具,中间是文档,右边是属性。我设法用这段代码做到了这一点:
我在基于 PRISM 的 WPF 应用程序中使用 AvalonDock。我的文档 Pane 能够 float (CanFloat =“true”)。但任务栏中不显示 float 窗口。有什么方法可以让
我在一个类似于 Notepad++ 的项目中使用Avalon Dock,我将文档作为文档内容,我面临的问题是当用户关闭文档内容时 如果他/她想在关闭前保存文档,我希望他得到一个弹出消息。 我怎样才能做
我正在使用 Avalon Wizard控制,我有很多页面,但只有 2 个给我带来问题,所以它们将是所有内容: 现在的问题是,主页的允许下一步工作正常,但是在扣除页面上,
我已经集成了流行的 UI 库 Mahapps与 Avalon.Wizard控制。 它集成得很好,但我对 Mahapps 对话框有疑问。向导控件定义一个 InitializeCommand 来处理向导页
我试图将 anchor 添加到特定的目标。为了做到这一点,我尝试实现ILayoutUpdateStrategy: public class DockingContentInitializer : IL
我正在使用 devexpress,在上下文菜单上试图隐藏 RootPanel 中存在的许多 LayoutDocument 之一。 下面是文档 Pane xml 文件。
我需要用于 Web 的文本编辑器 (jQuery) 具有代码完成 (intelli-sense) 支持,例如 AvalonEditor对于 WPF框架。 请分享建议。 Requirements: I
我是一名优秀的程序员,十分优秀!