文本框在加号之前显示换行符

4
当我在文本框中输入像 QgMAAB+LCAAAAAAABAB1UtFuwiAU/RXDsw9QrO36tmi2ly3L4mPTmGulSqTQwGWJMf77wBlXExpe4NxzOedcuBCJot8IdKSa1Rci3bsyO1Bvxn7CEMAOlBNzAs6ZVgKK/ 这样的字符串时,它会在每个加号(+)符号之前自动显示一个换行符: 我能不能使用自动换行(WordWrap),而不让加号使其进入新行?
我想让它看起来像这样: (我为演示删除了所有加号)

尝试将您的字符串包装在 @"your string" 中。 - Dumisani
这很遗憾并不能解决问题;它并没有改变任何东西。 - jacobz
1
@Jacobus21,您想在设计器中获取该文本框的完整宽度吗? - user2579857
我希望字符串显示为这样:http://i.imgur.com/4P96dFg.png(为了演示,我删除了所有加号) - jacobz
你尝试过设置:TextAlignment = "Justify"吗? - user2579857
6个回答

2
您可以通过子类化自己的文本框来覆盖文本框的单词换行功能。
这对我有用:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace myNamespace
{
    class MyTextBox : TextBox
    {
        const int EM_SETWORDBREAKPROC = 0x00D0;
        const int EM_GETWORDBREAKPROC = 0x00D1;

        delegate int EditWordBreakProc(string lpch, int ichCurrent, int cch, int code);

        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            if (!this.DesignMode)
            {
                SendMessage(this.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, Marshal.GetFunctionPointerForDelegate(new EditWordBreakProc(MyEditWordBreakProc)));
            }
        }

        [DllImport("User32.DLL")]
        public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

        int MyEditWordBreakProc(string lpch, int ichCurrent, int cch, int code)
        {
            return 0;
        }
    }
}

这是对在此处找到的优秀EditWordBreakProc示例的修改:

下划线作为分隔符C# RTF Box


1
这个文本框功能看起来是设计好的,应该使用RichTextBox代替。它不会因为+号而出现问题。

很奇怪,RichTextBox 在大约一半的加号上仍然会出现问题。http://i.imgur.com/viBkExi.png - jacobz
你是正确的。richTextBox 有一个更智能的换行功能,但它也会像对待空格一样对待加号。它会尽可能地在整个单词之间进行换行。 - mh__

0

你可以设置 WordWrap = false

或者你可以使用 RichTextBox 代替 TextBox。 附注:你可以使用 RichTextBox 代替 TextBox(但是你也必须为 RichTextBox 设置 WordWrap = false


0

其实在我们的情况下,文本格式有些奇怪。如果您添加:

 TextAlignment="Justify"

这将解决您在 '+' 方面的问题,但您仍然会在 \ 之后有一个换行符,因为它等待 \n\t\r

那么有没有办法让它不在任何字符后换行? - jacobz
很抱歉,您无法以这种方式格式化文本以获得全宽。正如我所说,您不能重新格式化“\”。 - user2579857
"System.Windows.Forms.TextBox" 不包含 "TextAlignment" 的定义,也没有接受类型为 "System.Windows.Forms.TextBox" 的第一个参数的扩展方法 "TextAlignment" 可以找到(您是否缺少使用指令或程序集引用?)。我正在使用 .NET 4.0。 - jacobz

0

这可能有点奇怪,但你可以使用以下方法解决 \ 的问题:

String.replace(String, String)

或者类似的方法。你甚至可以尝试编写自己的函数。 你可以检查你的字符串,如果它包含“\”,就将其替换为“\\”。我认为这应该能解决问题。

很抱歉,但我没有足够的声望在fisherXO的答案下添加评论。


是的,我只是举了一个例子。但我认为可以编写一个能够检测“\”的函数。例如,如果字符串的一部分包含/cc,则将其替换为//cc或类似的内容。 - Emi987

0
这对我有用:
using System;
using System.Windows.Forms;

namespace Namespace
{
    class CustomTextBox : TextBox
    {
        string _text;
        public CustomTextBox()
        {
            this.Multiline = true;
            this.Wordwrap = true;
            this.KeyDown += new KeyEventHandler(CustomTextBox_KeyDown);
            this.KeyPress += new KeyPressEventHandler(CustomTextBox_KeyPress);
        }

        void CustomTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '+')
                e.Handled = true;
            else
                _text = _text + e.KeyChar.ToString();
        }

        void CustomTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                e.Handled = true;
            else if (e.KeyCode == Keys.Add)
                _text = _text + @"+";
            this.Text = _text;
        }

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接