RichTextBox
的行号。
http://www.codeproject.com/Articles/38858/Line-Numbers-for-RichText-Control-in-C
有人有WPF版本的例子吗?编辑:
有没有使用过AvalonEdit的人?因为我想在我的程序中展示行号并且可以帮助我解决问题。
RichTextBox
的行号。
http://www.codeproject.com/Articles/38858/Line-Numbers-for-RichText-Control-in-C
有人有WPF版本的例子吗?我认为只需添加一个简单的解决方案...
Avalon
(下载)已被提到,以下是使用它进行行线的方法:
<avalon:TextEditor ShowLineNumbers="True" Width="500" Height="500"
Text="some more test some more test some more test some more test some more test some more test some more test some more test some more test ">
</avalon:TextEditor>
它是一个非常强大的编辑器——我一直在使用它进行生产(自定义语言编译器等)等工作。它是免费的,所以它有它的“怪癖”,但它让你做几乎任何你需要的事情。我不确定你指的是哪种格式化文本——但你需要的任何东西都可以完成,而且只需不多的代码行数,如果你知道在哪里插入(你可以添加自己的生成器、转换器、几乎任何视觉效果、代码完整性等——我对此没有任何利益关系:)
用于语法高亮的小样例:
<avalon:TextEditor
ShowLineNumbers="True"
SyntaxHighlighting="C#" Width="500" Height="500"
Text="void Test(int id, string name) { 	name = name + id.ToString();}" />
据我从代码中了解到的,支持的语法高亮包括:"XmlDoc", "C#", "JavaScript", "HTML", "ASP/XHTML", "Boo", "Coco", "CSS", "C+", "Java", "Patch", "PHP", "TeX", "VBNET", "XML"
。
如果您想要实现自己的定制化语法高亮(Avalon编辑器可高度扩展-详情请见该CodeProject文章),您需要定义自己的IHighlightingDefinition
,然后从代码中将其注册到HighlightingManager
中,并添加一些补充内容。但这是一个独立的长篇故事。
TextView
和自己的系统(与 RichTextBox 无关)。你需要熟悉它的内部工作方式(它是第三方控件),否则它可以很好地完成你所需的所有工作。 - NSGaga-mostly-inactive只需为您的文本框使用自定义模板;以下答案可能对您有所帮助:
更新
更改答案以使其按照OP期望的方式工作。
<Style x:Key="Local_TextBox" TargetType="{x:Type TextBoxBase}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<Border Name="Border" Background="{TemplateBinding Background}">
<ScrollViewer x:Name="PART_ContentHost" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
设计师,
<DockPanel>
<TextBlock Text="{Binding ElementName=uiTextBox, Path=(local:AttachedProperties.BindableLineCount)}"/>
<TextBox x:Name="uiTextBox" TextWrapping="Wrap" local:AttachedProperties.HasBindableLineCount="True"
AcceptsReturn="True" Text="{Binding LongText}" Style="{StaticResource Local_TextBox}" />
</DockPanel>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
namespace Cmsn.Software.Tutorials.numberedTextBox
{
public class AttachedProperties
{
#region BindableLineCount AttachedProperty
public static string GetBindableLineCount(DependencyObject obj)
{
return (string)obj.GetValue(BindableLineCountProperty);
}
public static void SetBindableLineCount(DependencyObject obj, string value)
{
obj.SetValue(BindableLineCountProperty, value);
}
// Using a DependencyProperty as the backing store for BindableLineCount. This enables animation, styling, binding, etc...
public static readonly DependencyProperty BindableLineCountProperty =
DependencyProperty.RegisterAttached(
"BindableLineCount",
typeof(string),
typeof(AttachedProperties),
new UIPropertyMetadata("1"));
#endregion // BindableLineCount AttachedProperty
#region HasBindableLineCount AttachedProperty
public static bool GetHasBindableLineCount(DependencyObject obj)
{
return (bool)obj.GetValue(HasBindableLineCountProperty);
}
public static void SetHasBindableLineCount(DependencyObject obj, bool value)
{
obj.SetValue(HasBindableLineCountProperty, value);
}
// Using a DependencyProperty as the backing store for HasBindableLineCount. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HasBindableLineCountProperty =
DependencyProperty.RegisterAttached(
"HasBindableLineCount",
typeof(bool),
typeof(AttachedProperties),
new UIPropertyMetadata(
false,
new PropertyChangedCallback(OnHasBindableLineCountChanged)));
private static void OnHasBindableLineCountChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var textBox = (TextBox)o;
if ((e.NewValue as bool?) == true)
{
textBox.SizeChanged += new SizeChangedEventHandler(box_SizeChanged);
textBox.SetValue(BindableLineCountProperty, textBox.LineCount.ToString());
}
else
{
textBox.SizeChanged -= new SizeChangedEventHandler(box_SizeChanged);
}
}
static void box_SizeChanged(object sender, SizeChangedEventArgs e)
{
var textBox = (TextBox)sender;
string x = string.Empty;
for (int i = 0; i < textBox.LineCount; i++)
{
x += i + 1 + "\n";
}
textBox.SetValue(BindableLineCountProperty, x);
}
#endregion // HasBindableLineCount AttachedProperty
}
}
textBox.TextChanged += new TextChangedEventHandler(box_SizeChanged);
。 - roadyScintillaNET是一个不错的组件。它是Notepad++编辑器(以及其他编辑器)中的关键组件的.NET版本。我不知道它与AvalonEdit相比如何,但我发现在我的代码中实现它相当容易,并且它具有您需要的功能(以及许多其他功能)。
一旦您已经安装了该组件并将其添加到您的表单中,您可以通过转到控件的属性并设置Margins>Margin0>Width来显示行号。您也可以通过编程方式设置这个属性:
scintilla1.Margins.Margin0.Width = 20;
您可以在AvalonEdit中找到最好的例子。除了行号之外,还有很多内容,但您可以研究它是如何完成的,代码非常清晰。这篇CodeProject文章是一个开始了解我们正在谈论的内容的起点。
这里有一篇不错的CodeProject文章,详细介绍了在TextBox控件中实现行号和其他一些不错的代码编辑功能的方法。如果您不关心它是如何构建的,只需下载示例文件并使用包含已编译控件的dll即可。