文本框,它做两件事

本文关键字:两件 文本 | 更新日期: 2023-09-27 18:15:04

我制作了一个文本框,但它需要将数据发送到其他具有自定义格式的应用程序(例如%B用于粗体,如果您想关闭粗体,则需要键入关键字用于正常字体,等等)。

因此,格式与通常有很大不同。我做了一个带有按钮的文本框,可以为文本格式添加关键字,这很好,但如果我需要在同一个应用程序的一个标签中预览,那该怎么做呢?(我做了一个预览按钮,将文本发送到标签)

显然,我需要设置%B在标签中开始加粗文本,因此对于其他格式化关键字,除非有更好的方法?

文本框,它做两件事

您的问题不清楚,您是否试图格式化文本框中的字符串以显示在带有或不带有粗体的标签中,或者您是否试图在标签中显示%B等格式示例?

对于第二个选项

,我将使用字面值字符串,这样符号就不会把您弄乱。即:

string here = @"%Byourtextboxtext";

对于第一个选项,我认为你需要创建一个处理字符串的函数。该函数应该接收一个字符串,根据自定义格式修改标签,清理字符串并将其应用于标签。即:

        if (textBox1.Text.StartsWith(@"%B"))
        {
            char[] here = {'%', 'B'};
            label1.Font = new Font(label1.Font, FontStyle.Bold);
            label1.Text = textBox1.Text.TrimStart(here);
        }

通常将这样的逻辑放入它自己的类中,通常会更容易看到某些代码块应该放在哪里。在你的例子中,我会创建一个FormattedTextModel保存文本。您的可编辑文本框可以更改此模型,并且预览标签侦听此模型的更改并在需要时更新自己。

预览文本框需要知道如何以另一种方式格式化中的文本,以便可以查看,例如使用RTF文本框。

class FormattedTextModel
{
    private string _raw;
    public event EventHandler TextChanged;
    public string RawText
    {
        set
        {
            _raw = value;
            EventHandler tmp = TextChanged;
            if (tmp != null) tmp(this, EventArgs.Empty);
        }
        get { return _raw; }
    }
    public string RTFText
    {
        return <Convert to rtf here>
    }
}

所以可编辑文本框和预览文本框都引用了这个模型的同一个实例。模型可以在可编辑的文本框上按下键来更改,以获得预览的"实时"更新,或者在使用按钮等时触发。

您可以创建自定义控件,继承自标签或控件,然后您必须重写控件的onpaint()方法并绘制您想要的文本(粗体,斜体),类似于以下伪代码:

        protected override void OnPaint(PaintEventArgs e)
        {
            //base.OnPaint(e);//must be clear
            //tranlate your metaText for exapmle after translate:
            e.Graphics.DrawString("B", Font(Bold), Brush, Ponit);
            e.Graphics.DrawString("B", Font(Regular), Brush, Ponit+n);
        }