Большая строка в метке, вызывающая зависание приложения (C# Windows)

У меня есть приложение Windows, где я получаю данные из базы данных и привязываю их к метке. Я использую таймер и прокручиваю метку, это прекрасно работает, когда строка длиной около 150 символов, но когда у меня строка длиной около 30000 символов, приложение просто зависает.

       lblMsg1.AutoEllipsis = true;
  private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                if (lblMsg1.Right <= 0)
                {
                    lblMsg1.Left = this.Width;
                }
                else
                    lblMsg1.Left = lblMsg1.Left - 5;

                this.Refresh();
            }
            catch (Exception ex)
            {

            }
        }

public void bindData()
{
lblMsg.Text = "Some Large text";
}

 public void Start()
        {
            try
            {
                timer1.Interval = 150;
                timer1.Start();
            }
            catch (Exception ex)
            {
                Log.WriteException(ex);
            }
        }

Почему это связано с длиной строки и вызывает зависание приложения? Заранее спасибо.

2 ответа

Решение

Я полагаю, вы пытаетесь создать новостную ленту? Я не уверен, что этикетки предназначены для хранения таких больших строк. Вместо этого используйте картинку и обновите свой код.

Определите две переменные в вашем классе формы. Один для хранения смещения текста, а другой для хранения графического объекта для графического блока. Как это:

private float textoffset = 0;
System.Drawing.Graphics graphics = null;

В форме onload сделайте это:

private void Form1_Load(object sender, EventArgs e)
{
    textoffset = (float)pictureBox1.Width; // Text starts off the right edge of the window
    pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    graphics = Graphics.FromImage(pictureBox1.Image);
}

Ваш таймер должен выглядеть так:

private void timer1_Tick(object sender, EventArgs e)
{
    graphics.Clear(BackColor);
    graphics.DrawString(newstickertext, new Font(FontFamily.GenericMonospace, 10, FontStyle.Regular), new SolidBrush(Color.Black), new PointF(textoffset, 0));
    pictureBox1.Refresh();
    textoffset = textoffset-5;
}

Вместо метки используйте TextBox и установите свойства ScrollBars, MultiLine и WordWrap в соответствии с вашими потребностями. Чтобы отключить редактирование TextBox (и, следовательно, сделать его похожим на метку), используйте свойство ReadOnly.

Другие вопросы по тегам