Как препятствовать тому, чтобы Windows Forms TextBox мерцал на, изменяют размер?

Я работаю в среде разработки Ajax и большей части кода бэкенда, который я пишу работам как канал между реляционной базой данных и frontend JavaScript (пользовательский интерфейс). Так, в наиболее используемой 'схеме' на говорится, что я использую, объекты JSON описать, как данные должны быть переданы назад и вперед между базой данных и интерфейсом. Они просты, универсальны и легки понять структуры данных.

Пример:

{"идентификатор": строка ['идентификатор'], "имя": строка ['имя'], "обязательное": ['обязательная'] строка, "rangeDescription": "Это - Диапазон", "globalRate": строка ['глобальная']}

17
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

В Windows Forms свойство DoubleBuffered не влияет на дочерние элементы управления, такие как текстовые поля. Вместо этого он влияет только на форму или панель, для которой он настроен.

Если вам нужна двойная буферизация для дочерних элементов в форме, вам нужно будет реализовать двойную буферизацию вручную.

Боб Пауэлл написал хорошую статью (и другие) о том, как это сделать.

Кроме того, из ответа на форуме Боб также говорит:

Право собственности на окно означает, что они будут бесконтрольно мерцать потому что вы не можете использовать двойную буферизацию за пределами целевой области окон. А панель с дочерними элементами управления не может быть сделано для двойного буфера и это дети, например.

Единственный способ сделать это правильно - создать единый элемент управления, который весь рисунок с использованием формы Графическая система с сохраненным режимом.

Следовательно, чтобы получить изменение размера текстового поля без мерцания с помощью двойной буферизации вручную, вам нужно каким-то образом визуализировать текстовое поле в задний буфер, а затем отобразить его как часть буферизованного обновления. Если даже возможно, я не думаю, что это будет легко.

[Обновление]

В некоторых других ответах говорилось, что это проблема именно с Windows Forms. Это неверно, это на самом деле глубже и вызвано Windows GDI. В качестве примера откройте Блокнот / Wordpad и т. Д. И вставьте большой кусок текста, измените размер окна и обратите внимание на ту же проблему мерцания.

Вот базовое решение, которое я использовал несколько лет назад, чтобы сделать нечто подобное. Это простая форма, содержащая многострочное текстовое поле и настраиваемый класс, унаследованный от Panel. Оба элемента управления имеют одинаковое расположение и размер. Он использует Forms ResizeBegin и ResizeEnd для отображения панели при изменении размера и текстового поля в противном случае. Это не идеально, но устраняет мерцание.

   public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Bitmap bm = null;

        private void textBox1_Resize(object sender, EventArgs e)
        {

            Graphics g = textBox1.CreateGraphics();

            if (g.VisibleClipBounds.IsEmpty == false)
            {
                bm = new Bitmap((int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height);

                textBox1.DrawToBitmap(bm, new Rectangle(0, 0, (int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height));

            }

            g.Dispose();


        }

        private void panelDB1_Paint(object sender, PaintEventArgs e)
        {
            if (bm != null)
            {
                e.Graphics.DrawImageUnscaled(bm, 0, 0,bm.Width,bm.Height );
            }
        }

        private void Form1_ResizeBegin(object sender, EventArgs e)
        {
            panelDB1.BringToFront();  
        }

        private void Form1_ResizeEnd(object sender, EventArgs e)
        {
            panelDB1.SendToBack();   
        }
}

class PanelDB : Panel
{
    public PanelDB()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer,true);       
        //this.DoubleBuffered = true; 

    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    }
}
4
ответ дан 30 November 2019 в 14:12
поделиться

Мы сталкивались с подобной проблемой в прошлом, и она заключалась в использовании чрезмерного количества панелей стыковки и макета стола. Я предлагаю, если возможно, попытаться воссоздать пользовательский интерфейс с минимальным использованием стыковки (поскольку панель макета таблицы также использует стыковку внутри).

0
ответ дан 30 November 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: