1、显示滚动条
垂直滚滚动条始终显示(水平滚动条HorizontalScrollBarVisibility设置相同)
后台.cs文件设置
richTextBoxWPF.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
或者在前端设计页面设置
VerticalScrollBarVisibility="Visible"
2、写入数据并设置格式
后台.cs文件设置
private void Window_Loaded(object sender, RoutedEventArgs e)
{
titleText = new string[] { "1", "2"};
titleTextEven = new string[] { "a", "b" };
Brush rowFontColor = Brushes.Red;
Brush evenRowFontColor = new SolidColorBrush(Color.FromRgb(64, 165, 252));
Brush otherFontColor = Brushes.Black;
List<string> list = Common.GetList();
richTextBoxWPF.Document.Blocks.Clear();
foreach (string item in list)
{
Paragraph paragraph = new Paragraph();
Run run = new Run(item);
int type = GetColorTypeFromLine(item);
if (type == 1)
run.Foreground = rowFontColor;
else if (type == 2)
run.Foreground = evenRowFontColor;
else
run.Foreground = otherFontColor;
paragraph.Inlines.Add(run);
richTextBoxWPF.Document.Blocks.Add(paragraph);
}
private int GetColorTypeFromLine(string strLine)
{
int result = 0;
if (titleText == null || titleText.Count() <= 0 || titleTextEven == null || titleTextEven.Count() <= 0)
return 0;
foreach (string item in titleText)
{
if (strLine.StartsWith(item))
return 1;
}
foreach (string item in titleTextEven)
{
if (strLine.StartsWith(item))
return 2;
}
return result;
}
3、键盘按键获取事件
使用_PreviewKeyDown(object sender, KeyEventArgs e)事件,
而不是_KeyDown(object sender, KeyEventArgs e)
因为键盘按键按下的时候KeyDown事件并没有被触发
private void RichTextBoxWPF_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Back)//Backspace
{
}
else if (e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up || e.Key == Key.Down)//上下左右
{
}
else if (e.Key == Key.Enter)//回车
{
e.Handled=true;//当前回车已执行,=无效
}
}
4、设置行距
有两种方法:
1、 将目标每段文本单独放到一个段落中,在段落上设置颜色格式等。这个有个好处就是每个段落的文本是分开的,不需要手动换行。
在段落上设置LineHeight,段落之间行距设置成功,但是段落内部的自动换行的行,是没有行距效果的。如果此时文本框输入回车的话,会导致段落之间的行距非常大或者非常小。
所以除了设置文本行高还要设置段落间的行距。段落间的行距在.xmal页面设置
后台.cs
richTextBoxWPF.Document.Blocks.Clear();
richTextBoxWPF.Document.LineHeight = 40;
foreach (string item in dataObj)
{
Run run = new Run(item);
Brush brush = Brushes.Black;
richTextBoxWPF.Document.Blocks.Add(new Paragraph(run) { Foreground = brush });
}
2、将整个文本放到同一个段落中,整个文本框就只能有一个Paragraph。将目标每段文本放到一个run中,加入换行符,在run上设置颜色格式等。然后设置richTextBox.Document.LineHeight。
注意:此时的每行文本是不会换行的,想要达到理想的换行效果,需要每行文本手动加上换行。
richTextBoxWPF.Document.LineHeight = 40;
Paragraph paragraph = new Paragraph();
foreach (string item in list)
{
Run run = new Run(item + Environment.NewLine); //手动加换行
run.Foreground = Brushes.Black;
paragraph.Inlines.Add(run);
}
richTextBoxWPF.Document.Blocks.Add(paragraph);
5、设置字体和大小及样式
修改字体、字体样式和字体大小,整个文本框字体及样式、大小改变。
每次只修改一种属性的话,不会改变其他已经设置的过的格式。这点和winform的RichTextBox不同。
//字体大小
double size = 14d;
richTextBoxWPF.FontSize = size;
//字体
richTextBoxWPF.FontFamily = new FontFamily("宋体");
//字体倾斜
richTextBoxWPF.FontStyle = FontStyles.Italic;
6、获取文本内容
//赋值的字符串
TextRange textAll = new TextRange(richTextBoxWPF.Document.ContentStart, richTextBoxWPF.Document.ContentEnd);
string str = textAll.Text;
//赋值的字符串和设计页面xmal标签,类似网页源码
string strAll = System.Windows.Markup.XamlWriter.Save(richTextBoxWPF.Document);
7、滚动条鼠标拖动事件
WPF中的RichTextBox滚动条滚动事件只有一个PreviewMouseWheel,但是这个是鼠标滚轮滚动时触发的。
我想要的效果是:假设有一个弹框显示在文本框上,我想在鼠标滚动滚轮带动滚动条移动时,关闭弹框。或者是鼠标在拖动滚动条时,关闭弹框。只有滚动条移动就关闭弹框。
其中鼠标滚动滚轮带动滚动条移动时,触发的事件可用PreviewMouseWheel
鼠标在拖动滚动条时,需要添加事件,详见https://blog.csdn.net/abrahamcheng/article/details/7101498
public void ClosePop()
{
if (popup.IsOpen)
{
popup.IsOpen = false;
isPopup = true;
richTextBoxWPF.Focus();
}
}
private void window1_Loaded(object sender, RoutedEventArgs e)
{
CommandManager.AddPreviewExecutedHandler(richTextBoxWPF, new ExecutedRoutedEventHandler(OnScorllCommandForRichTextBox));
richTextBoxWPF.PreviewMouseWheel += RichTextBoxWPF_PreviewMouseWheel;
}
//鼠标在拖动滚动条
private void OnScorllCommandForRichTextBox(object sender, ExecutedRoutedEventArgs e)
{
RoutedCommand command = (RoutedCommand)e.Command;
Debug.WriteLine(string.Format("OnCommand: {0}", command.Name));
//鼠标拖动滚动条时
if (command.Name.Equals("ScrollToVerticalOffset", StringComparison.CurrentCultureIgnoreCase))
{
ClosePop();
}
}
//鼠标滚动滚轮带动滚动条移动时
private void RichTextBoxWPF_PreviewMouseWheel(object sender, MouseWheelEventArgs e
{
ClosePop();
}