Создание текстового поля без мерцания, которое можно быстро обновить - PullRequest
3 голосов
/ 15 января 2010

Я пытаюсь создать инструмент поиска и хотел бы отобразить результаты в текстовом поле, очень похожем на то, которое содержится в Visual Studio - это означает, что при длительном поиске результаты будут добавляться в конец текстового поля. пока пользователь пытается просмотреть результаты в верхней части текстового поля.

В настоящее время я использую стандартное текстовое поле, однако у него много проблем:

  • Текстовое поле безумно мерцает во время поиска
  • Пользователь не может выполнять прокрутку, пока результаты добавляются в поле
  • Пользователь не может копировать и вставлять результаты в текстовое поле во время добавления результатов.

Есть ли способы обойти эти проблемы, или я должен изучить использование другого элемента управления / создание своего собственного?

Ответы [ 3 ]

3 голосов
/ 15 января 2010

Сначала, чтобы получить доступ к вашему TextBox во время поиска, вы должны поместить свой поиск в BackgroundWorker и поместить (промежуточные) результаты с BeginInvoke() в свой TextBox. Таким образом, ваш графический интерфейс не зависает при выполнении поиска.

Также вы должны использовать метод TextBox.AppendText(), чтобы добавить текст в поле. И если вы хотите автоматическую прокрутку, используйте два вкладыша ниже после AppendText:

textBoxMessages.SelectionStart = textBoxMessages.Text.Length;
textBoxMessages.ScrollToCaret();

И если вы хотите включить / отключить автоматическую прокрутку, вы можете перед тем, как AppendText проверить, равен ли SelectionStart Text.Lenght и только если это правда, сделать два вышеупомянутых вкладыша после AppendText

Обновление

Хорошо, чтобы избавиться от от мерцания , в текстовом поле нет реального решения. Когда я упомянул правильно, вы можете попробовать RichTextBox, потому что он лучше справляется с этими проблемами прокрутки.

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

Единственное, что вы не можете сделать элегантно с помощью ScintillaNet (или лучше с Scintilla), это раскрасить вручную пользовательский раздел. Вы всегда должны использовать лексер, который работает с предопределенным форматированием в списке ключевых слов.

2 голосов
/ 15 января 2010

Microsoft забыла реализовать методы Begin / EndUpdate () для TextBox. Вы можете добавить их самостоятельно, это решит проблему. Вы не можете избавиться от мерцания, хотя. Пример кода:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            timer1.Interval = 10;
            timer1.Tick += new EventHandler(timer1_Tick);
            button1.Click += new EventHandler(button1_Click);
        }
        void timer1_Tick(object sender, EventArgs e) {
            int pos = textBox1.SelectionStart;
            int len = textBox1.SelectionLength;
            SendMessage(textBox1.Handle, 11, IntPtr.Zero, IntPtr.Zero);
            textBox1.AppendText(DateTime.Now.ToString() + Environment.NewLine);
            SendMessage(textBox1.Handle, 11, (IntPtr)1, IntPtr.Zero);
            //if (textBox1 is RichTextBox) textBox1.Invalidate();
            textBox1.SelectionStart = pos;
            textBox1.SelectionLength = len;
        }
        private void button1_Click(object sender, EventArgs e) {
            timer1.Enabled = !timer1.Enabled;
        }
        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    }
}
1 голос
/ 15 января 2010

Текстовые поля хороши для редактируемого контента - можно ли редактировать результаты поиска?

Если вы отображаете результаты поиска, почему бы вам не использовать DataGrid? Вы можете создать его так, как вы хотите (он может выглядеть как текстовое поле со строками и строками текста)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...