我有一个readonly数据记录窗口,我使用RichTextBox控件实现.我希望能够禁用用户单击控件时发生的自动滚动,以便用户可以选择特定日志进行复制/粘贴操作或其他任何操作.但是,只要用户点击RichTextBox,它就会自动滚动到底部,这使得这很困难.
有人知道一种方法来覆盖这种行为吗?
谢谢!
private void button1_Click(object sender, EventArgs e)
{
richTextBox1.AppendText("\r\n");
richTextBox1.Focus();
string s = "Enter ";
richTextBox1.AppendText(s + "\r\n");
richTextBox1.SelectionStart = richTextBox1.Text.Length - (s.Length +1);
richTextBox1.SelectionLength = s.Length +1;
richTextBox1.SelectionFont = new Font("Arial", 12, FontStyle.Bold);
richTextBox1.DeselectAll();
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.SelectionLength = richTextBox1.Text.Length;
richTextBox1.SelectionFont = new Font("Arial", 12, FontStyle.Regular);
richTextBox1.DeselectAll();
}
Run Code Online (Sandbox Code Playgroud)
每次用户点击按钮时,我都希望新的"Enter"位于RichTextBox底部而不是底部.我该怎么做?
我可能完全想象这个,但我可以发誓有一种方法可以将RichTextBox中的单个Run(或Parapgraph)元素设置为只读.我也可以发誓几周前我尝试了一种自己做的方法并对结果感到满意 - 我依稀记得它看起来像这样:
<RichTextBox x:Name="richTextBox"
AcceptsTab="True"
AcceptsReturn="True"
FontFamily="Courier New"
FontSize="14">
<FlowDocument>
<Paragraph>
<Run IsReadOnly="True">I wish this was read-only!</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>
Run Code Online (Sandbox Code Playgroud)
现在,几个星期后,我尝试在RichTextBox中使Run元素只读,但发现它似乎不可能.
MSDN论坛上的这篇文章似乎证实了这一点.
我完全想象这个吗?或者有办法做我想做的事吗?
我有一个富文本框,可能包含一个字符串,其中包含粗体,斜体,甚至不同的字体和大小的元素.如果我选择整个字符串,包括所有差异,我如何"加粗"该字符串而不将整个字符串转换为只有"粗体"属性的通用字体?
例如:我想把"这是一些 text "变成" 这是一些 text "
请注意,"有些"仍然是斜体,"text"仍然是不同的字体.
我目前所拥有的是相当简单的:
private void tsBold_Click(object sender, EventArgs e)
{
if (rtb.SelectionFont == null) return;
Font f;
if (tsBold.Checked)
f = new Font(rtb.SelectionFont, FontStyle.Bold);
else
f = new Font(rtb.SelectionFont, FontStyle.Regular);
rtb.SelectionFont = f;
rtb.Focus();
}
Run Code Online (Sandbox Code Playgroud)
当然,这将使用完全相同的字体到整个选择.有没有办法只是将"粗体"附加到现有字体?
答案 虽然下面的"官方"答案只是冰山一角,但这是我在正确方向上所需要的推动力.谢谢你的提示.
这是我的正式修复:
我将它添加到我的RichTextBox对象:
/// <summary>
/// Change the richtextbox style for the current selection
/// </summary>
public void ChangeFontStyle(FontStyle style, bool add)
{
//This method should handle cases that occur when multiple fonts/styles are selected …Run Code Online (Sandbox Code Playgroud) 如果只给出要选择的某个文本的索引和长度(或EndIndex),那么如何在WPF版本的RichTextBox中执行此操作?
这在Textbox中是非常可行的,因为你可以调用Textbox.Select(startIndex,Length)但我在RTB中看不到任何等价物.
编辑:我找到了做出选择的答案
internal string Select(RichTextBox rtb, int index, int length)
{
TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
if (textRange.Text.Length >= (index + length))
{
TextPointer start = textRange.Start.GetPositionAtOffset(index, LogicalDirection.Forward);
TextPointer end = textRange.Start.GetPositionAtOffset(index + length, LogicalDirection.Backward);
rtb.Selection.Select(start, end);
}
return rtb.Selection.Text;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在选择完成后尝试突出显示该行时:
rtb.Selection.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.LightBlue));
Run Code Online (Sandbox Code Playgroud)
突出显示功能仅在第一次尝试时起作用,在第二次尝试后中断.有谁知道这个的原因?
我正在显示RTF文档RichTextBox("已升级" RichEdit50W).文档中的关键字使用语法链接到网页:
{\field{\*\fldinst{HYPERLINK ""https://www.example.com/"" }}{\fldrslt{\cf1 keyword\cf0 }}}
Run Code Online (Sandbox Code Playgroud)
我不想强调关键字.在Windows 10版本1803(以及所有以前版本的Windows,包括XP,Vista,8)中,只要在锚点上设置了颜色(注意\cf1),锚点就不会加下划线.
但这不再适用于Windows 10版本1803.我将向Microsoft报告此情况.但我不确定,如果我不依赖于无证件的行为.我可以想象这个改变实际上不是一个错误,而是一个修复.所以我想知道是否有更正确的方法来防止超链接加下划线.
示例代码:
public class ExRichText : RichTextBox
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryW", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern IntPtr LoadLibraryW(string path);
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
LoadLibraryW("MsftEdit.dll");
cp.ClassName = "RichEdit50W";
return cp;
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ExRichText rtb = new ExRichText();
rtb.Parent = this;
rtb.SetBounds(10, 10, …Run Code Online (Sandbox Code Playgroud) 如何在RTF中获取文本RichTextBox?我试图这样,但财产不存在.
RichTextBox rtb = new RichTextBox();
string s = rtb.Rtf;
Run Code Online (Sandbox Code Playgroud) 无论如何,RichRextBox只要文本框得到焦点,就会阻止只读的光标(IBeam)闪烁吗?
我试图阻止WM_SETFOCUS来自该消息,WndProc但它导致表单挂起.
if( m.Msg == 0x0007 ) return;
Run Code Online (Sandbox Code Playgroud) 有人可以解释我如何测量richtextbox控件中的字符串,以便我可以根据其内容自动调整richtextbox控件的大小?
谢谢
编辑:
我已经考虑过了,因为如果RichTextBox控件中有不同的字体,下面的答案将不起作用,如果,我可以得到richtextbox控件的左上角,然后得到右下角的coords rtb内最后一行文字.这基本上会给我RichTextBox控件中字符串的宽度和高度.这可能吗?或者这样做是不是一个坏主意?
我正在构建一个应用程序,它需要允许用户从另一个插入RichTextBox当前插入位置的文本中插入文本.在运行这种技术之前,我花了很多时间搞砸了FlowDocument对象模型 - source并且target都是FlowDocuments:
using (MemoryStream ms = new MemoryStream())
{
TextRange tr = new TextRange(source.ContentStart, source.ContentEnd);
tr.Save(ms, DataFormats.Xaml);
ms.Seek(0, SeekOrigin.Begin);
tr = new TextRange(target.CaretPosition, target.CaretPosition);
tr.Load(ms, DataFormats.Xaml);
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.
我现在唯一的问题是它总是将源插入一个新的段落.它打破插入符号的当前运行(或其他),插入源,并结束段落.如果源实际上是一个段落(或多个段落),那是合适的,但如果它只是(比方说)一行文本则不合适.
我认为对此的答案很可能是最终检查目标是否完全由单个块组成,如果是,则TextRange在保存之前将块设置为块内容的开头和结尾到溪边.
整个世界FlowDocument对我来说都是一片黑暗神秘的海洋.如果必须的话,我可以成为它的专家(根据陀思妥耶夫斯基:"人是可以适应任何事物的动物."),但是如果有人已经想出这个并且可以告诉我该怎么做它会让我生活更容易.
richtextbox ×10
c# ×8
.net ×4
winforms ×4
wpf ×4
.net-3.5 ×1
autoresize ×1
flowdocument ×1
measure ×1
rtf ×1
textrange ×1
winapi ×1
wpf-controls ×1
xaml ×1