Операция Cross Thread для действий выбора Rich Text Box - PullRequest
0 голосов
/ 08 ноября 2019

Я создал настраиваемое поле Rich Text в своем приложении WinNet .Net, и столкнулся со странной проблемой. Цель - добавить текст в поле расширенного текста с определенным форматированием, и все это в другом потоке. Для этого я создал делегатов обратного вызова. Как только я начинаю использовать любое свойство «Selection» из расширенного текстового поля, я получаю исключение 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 и позволяю только строке Text += text все работает нормально. Я действительно не понимаю, почему возникает ошибка при добавлении элемента управления, и есть ли какие-либо конкретные знания, которые мне нужно иметь о действиях выбора?

...