У меня есть собственный richtextbox, написанный на C # 2.0. Пользователь будет вводить японский текст в этом текстовом поле. Когда пользователь печатает, если размер текста превышает 300, дополнительные символы выделяются желтым цветом. Японский текст может содержать символы половинной ширины и полной ширины, и я хочу считать символ половинной ширины как размер «0.5» и символ полной ширины как размер «1».
Вот мой код ...
Dictionary<int, float> charSizes = new Dictionary<int, float>();
void HighlightingTextBox_TextChanged(object sender, EventArgs e)
{
int index = this.SelectionStart;
// Reset highlighting and font.
HighlightText(0, this.BackColor, true);
// Highlight Text
float charCount = 0;
int highlightIndex = 0;
string currentText = this.Text;
for (int k = 0; k < currentText.Length; k++)
{
int c = currentText[k];
if (charCount <= CharacterLimit)
{
if (charSizes.ContainsKey(c)) // Use already calculated Size
charCount = charCount + charSizes[c];
else
{
// Check if character is Half width or Full Width
string charString = currentText[k].ToString();
string fullChar = Microsoft.VisualBasic.Strings.StrConv(charString, Microsoft.VisualBasic.VbStrConv.Wide, 1041);
if (c == (int)fullChar[0])
{
// Ascci value matches after converting to full width. So its Full width char.
charCount++;
charSizes[c] = 1;
}
else
{
charCount = charCount + 0.5f;
charSizes[c] = 0.5f;
}
}
highlightIndex++;
}
// Enforce "Arial" font for English characters in Japanese text
this.Select(k, 1);
this.SelectionFont = (c < 128) ? new Font("Arial", 9.5f) : this.Font;
this.SelectionLength = 0;
}
if (charCount > CharacterLimit)
HighlightText(highlightIndex, HighlightColor, false);
this.SelectionStart = index;
}
private void HighlightText(int selectionStart, Color highlightColor, bool enforceFont)
{
this.Select(selectionStart, this.Text.Length);
this.SelectionBackColor = highlightColor;
if (enforceFont)
this.SelectionFont = this.Font;
this.SelectionLength = 0;
}
В чем проблема?
Этот код работает нормально для первых 8-10 символов. Но после этого он работает очень медленно (занимает много времени, так как проходит через «КАЖДЫЙ» символ текста). Если пользователь печатает быстро, для отображения новых символов в пользовательском интерфейсе требуется несколько секунд.
Как улучшить производительность в этом случае? Есть ли другой способ для этого расчета?