WPF的RichTextBox使用

1、显示滚动条
垂直滚滚动条始终显示(水平滚动条HorizontalScrollBarVisibility设置相同)

后台.cs文件设置

richTextBoxWPF.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;

或者在前端设计页面设置
VerticalScrollBarVisibility="Visible"
WPF的RichTextBox使用_第1张图片
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;
   }

或者在前端设计页面设置



文本内容



WPF的RichTextBox使用_第2张图片

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();
}

你可能感兴趣的:(WPF,系统控件使用)