富文本框选择操作上的跨线程操作

我已经在.Net winform应用程序中创建了一个自定义的Rich Text框,但是我遇到了一个奇怪的问题。目标是将文本附加到具有特定格式的富文本框,所有这些都在另一个线程中。为此,我创建了委托回调。一旦我开始使用富文本框中的任何“选择”属性,就会收到cross_thread异常,但在Controls.add(control)功能中……

以下是不同的代码:

主表单

public partial class NotificationForm : Form
{
    private ProductLayout productLayout = null;
    delegate void AddControlDelegate(Control control);
    delegate void ClearControlDelegate();

    public NotificationForm()
    {
        InitializeComponent();
        productLayout = new ProductLayout();
    }

    public void SetProductContent(ProductResponse product)
    {
        ClearControls();
        productLayout.SetProductContent(product);
        AddControl(productLayout);
    }

    public void ClearControls()
    {
        if (InvokeRequired)
        {
            ClearControlDelegate d = new ClearControlDelegate(ClearControls);
            Invoke(d);
        }
        else
        {
            foreach (Control ctrl in Controls)
            {
                Controls.Remove(ctrl);
            }
        }
    }

    public void AddControl(Control control)
    {
        if (InvokeRequired)
        {
            AddControlDelegate d = new AddControlDelegate(AddControl);
            Invoke(d,new object[] { control });
        }
        else
        {
            // Cross Thread Error thrown here complaining about access of rtb_content
            Controls.Add(control);
        }
    }
}

用户控制

public partial class ProductLayout : UserControl
{
    delegate void SetProductCallback(ProductResponse product);

    public ProductLayout()
    {
        InitializeComponent();
    }

    public void SetProductContent(ProductResponse product)
    {
        if(InvokeRequired)
        {
            SetProductCallback d = new SetProductCallback(SetProductContent);
            Invoke(d,new object[] { product });
        } else
        {
            // My custom rich text box
            rtb_content.AppendText(product.name_prefix,Color.Black);
            rtb_content.AppendText(product.name,Color.Black);
        }
    }
}

自定义富文本框

public partial class EnhancedTextBox : RichTextBox
{
    delegate void AppendTextCallback(string text,Color color);

    public EnhancedTextBox()
    {
        InitializeComponent();
    }

    public void AppendText(string text,Color color)
    {
        if (InvokeRequired)
        {
            AppendTextCallback d = new AppendTextCallback(AppendText);
            Invoke(d,new object[] { text,color });
        }
        else
        {
            SelectionStart = TextLength;
            SelectionLength = 0;

            SelectionColor = color;
            SelectionFont = font;
            AppendText(text);
            SelectionColor = ForeColor;
        }
    }
}

如果我删除了AppendText中的Selection动作,仅让Text += text行一切正常。我真的不明白为什么添加控件时会引发错误,并且我是否需要有关选择操作的特定知识?

jjl249144301 回答:富文本框选择操作上的跨线程操作

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3136830.html

大家都在问