我在C#应用程序中使用Rich Text对象。我遇到的唯一问题是,当用户从另一个应用程序粘贴格式化文本时,它仍然是我不能拥有的格式。有没有办法如何只粘贴字符串并忽略格式? 谢谢!
答案 0 :(得分:28)
为KeyDown
- 事件添加处理程序以拦截标准粘贴并手动仅插入纯文本:
private void rtb_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.V)
{
((RichTextBox)sender).Paste(DataFormats.GetFormat("Text"));
e.Handled = true;
}
}
答案 1 :(得分:9)
假设WinForms:试试这个:使用KeyDown事件处理程序定义一个RichTextBox,如下所示:
仅附加示例:
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.V)
{
richTextBox1.Text += (string)Clipboard.GetData("Text");
e.Handled = true;
}
}
[编辑]
在当前插入点(选择开始)示例中将剪贴板RTF添加到RichTextBox:
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.V)
{
// suspend layout to avoid blinking
richTextBox2.SuspendLayout();
// get insertion point
int insPt = richTextBox2.SelectionStart;
// preserve text from after insertion pont to end of RTF content
string postRTFContent = richTextBox2.Text.Substring(insPt);
// remove the content after the insertion point
richTextBox2.Text = richTextBox2.Text.Substring(0, insPt);
// add the clipboard content and then the preserved postRTF content
richTextBox2.Text += (string)Clipboard.GetData("Text") + postRTFContent;
// adjust the insertion point to just after the inserted text
richTextBox2.SelectionStart = richTextBox2.TextLength - postRTFContent.Length;
// restore layout
richTextBox2.ResumeLayout();
// cancel the paste
e.Handled = true;
}
}
[结束编辑]
注意0:粘贴的文本 将假设当前样式设置对RichTextBox有效:如果你将'ForeGround颜色设置为'蓝色:粘贴的文本将是蓝色。
注意1:这是我快速拼凑的东西,并且通过使用写字板为剪贴板创建一些多色和奇怪格式的RTF进行了几次测试:然后在运行时粘贴到RichTextBox1中:它确实剥离了消除所有颜色,缩进等。
由于未经过全面测试,请谨慎使用。
注2:显然,这不会处理“插入”或“通过上下文菜单粘贴”的情况。
欢迎对此答案的所有批评,并且如果它不是“标记”,将立即将其删除。
答案 2 :(得分:4)
我正在搜索纯文本richtextbox
,但尚未在线找到解决方案。
为什么只有纯文本RichTextBox
而不是TextBox
?例如,因为RichTextBox
具有可用的撤消/重做功能等等。
最后,我通过挖掘richedit控件的C头文件找到了一个完美的解决方案:一个RichTextBox
可以切换到明文模式,之后它不接受格式化的文本和图像以及类似的东西。剪贴板和行为类似于正常TextBox
格式化。无法粘贴图像等奇特的东西,并通过删除格式来粘贴格式化文本。
class PlainRichTextBox : RichTextBox
{
const int WM_USER = 0x400;
const int EM_SETTEXTMODE = WM_USER + 89;
const int EM_GETTEXTMODE = WM_USER + 90;
// EM_SETTEXTMODE/EM_GETTEXTMODE flags
const int TM_PLAINTEXT = 1;
const int TM_RICHTEXT = 2; // Default behavior
const int TM_SINGLELEVELUNDO = 4;
const int TM_MULTILEVELUNDO = 8; // Default behavior
const int TM_SINGLECODEPAGE = 16;
const int TM_MULTICODEPAGE = 32; // Default behavior
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
bool m_PlainTextMode;
// If this property doesn't work for you from the designer for some reason
// (for example framework version...) then set this property from outside
// the designer then uncomment the Browsable and DesignerSerializationVisibility
// attributes and set the Property from your component initializer code
// that runs after the designer's code.
[DefaultValue(false)]
//[Browsable(false)]
//[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool PlainTextMode
{
get
{
return m_PlainTextMode;
}
set
{
m_PlainTextMode = value;
if (IsHandleCreated)
{
IntPtr mode = value ? (IntPtr)TM_PLAINTEXT : (IntPtr)TM_RICHTEXT;
SendMessage(Handle, EM_SETTEXTMODE, mode, IntPtr.Zero);
}
}
}
protected override void OnHandleCreated(EventArgs e)
{
// For some reason it worked for me only if I manipulated the created
// handle before calling the base method.
PlainTextMode = m_PlainTextMode;
base.OnHandleCreated(e);
}
}
答案 3 :(得分:0)
RichTextBox具有SelectionFont
属性,因此您可以执行以下操作:
Font courier;
courier = new Font("Courier new", 10f, FontStyle.Regular);
myRtb.SelectionFont = courier;
myRtb.Font = courier; //So the typed text is also the same font
如果文字被粘贴,它将自动格式化。
答案 4 :(得分:0)
您也可以使用
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.V)
{
richTextBox1.SelectedText = (string)Clipboard.GetData("Text");
e.Handled = true;
}
}
答案 5 :(得分:0)
我通过在更改内容时更改整个RTB的字体和颜色来实现此目的。这对我来说很好,因为输入框不需要处理大量的文本。
public FormMain()
{
InitializeComponent();
txtRtb.TextChanged += txtRtb_TextChanged;
}
void txtRtb_TextChanged(object sender, EventArgs e)
{
RichTextBox rtb = (RichTextBox)sender;
rtb.SelectAll();
rtb.SelectionFont = rtb.Font;
rtb.SelectionColor = System.Drawing.SystemColors.WindowText;
rtb.Select(rtb.TextLength,0);
}
答案 6 :(得分:0)
我的解决方案
private void OnCommandExecuting(object sender, Telerik.Windows.Documents.RichTextBoxCommands.CommandExecutingEventArgs e)
{
if (e.Command is PasteCommand)
{
//override paste when clipboard comes from out of RichTextBox (plain text)
var documentFromClipboard = ClipboardEx.GetDocumentFromClipboard("RadDocumentGUID");
if (documentFromClipboard == null)
{
(sender as RichTextBox).Insert(Clipboard.GetText());
e.Cancel = true;
}
}
}
答案 7 :(得分:0)
有一种非常简单的方法可以对我有效:
private bool updatingText;
public MyForm() {
InitializeComponent();
inputTextBox.TextChanged += inputTextBox_TextChanged;
}
private void inputTextBox_TextChanged(object sender, EventArgs e)
{
if (updatingText)
{
return;
}
updatingText = true;
try
{
var i = inputTextBox.SelectionStart;
var text = inputTextBox.Text;
inputTextBox.Rtf = "";
inputTextBox.Text = text;
inputTextBox.SelectionStart = i;
}
catch (Exception){}
updatingText = false;
}
由于Text
属性是固有的,无需格式化即可重置RTF文本,因此将text属性设置为raw输入将删除可能粘贴的任何特殊项目。
答案 8 :(得分:-2)
很简单,但是当应用程序打开时,剪贴板中的所有内容都是纯文本。
private void timer2_Tick(object sender, EventArgs e)
{
string paste = Clipboard.GetText();
Clipboard.SetText(paste);
}