Я создал настраиваемое поле 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
все работает нормально. Я действительно не понимаю, почему возникает ошибка при добавлении элемента управления, и есть ли какие-либо конкретные знания, которые мне нужно иметь о действиях выбора?