Как к двойному буферу.NET управляет на форме?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

48
задан JYelton 30 December 2015 в 08:01
поделиться

9 ответов

Вот более универсальная версия решение .

Макета, Мы можем использовать отражение для достигания защищенного свойство DoubleBuffered , и затем это может быть установлено на верный .

Примечание : Вы должны платить свои налоги разработчика а не двойная буферизация использования, если пользователь будет работать на сессии служб удаленных рабочих столов (например, Удаленный рабочий стол), то Этот вспомогательный метод не включит двойную буферизацию, если человек будет работать в удаленном рабочем столе.

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
   //Taxes: Remote Desktop Connection and painting
   //http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
   if (System.Windows.Forms.SystemInformation.TerminalServerSession)
      return;

   System.Reflection.PropertyInfo aProp = 
         typeof(System.Windows.Forms.Control).GetProperty(
               "DoubleBuffered", 
               System.Reflection.BindingFlags.NonPublic | 
               System.Reflection.BindingFlags.Instance);

   aProp.SetValue(c, true, null); 
}
86
ответ дан Richard Neish 7 November 2019 в 12:01
поделиться

Проверьте этот поток

Повторение ядра того ответа, можно включить флаг стиля WS_EX_COMPOSITED на окне для получения и формы и всех ее средств управления, с двойной буферизацией. Флаг стиля доступен начиная с XP. Это не делает рисование быстрее, но все окно оттягивается во внеэкранном буфере и блитируется на экран в одном сильном ударе. Создание его выглядеть мгновенными к глазам пользователя без видимых артефактов рисования. Это не совсем безаварийно, некоторые визуальные рендереры стилей могут дать незначительный сбой на нем, особенно TabControl, когда имеет слишком много вкладок. YMMV.

Вставка этот код в Ваш класс формы:

protected override CreateParams CreateParams {
    get {
        var cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;    // Turn on WS_EX_COMPOSITED
        return cp;
    } 
}

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

65
ответ дан Hans Passant 7 November 2019 в 12:01
поделиться
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control)
    .GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.Instance);
aProp.SetValue(ListView1, true, null);

Ian имеет еще некоторую информацию об использовании этого на терминальном сервере.

18
ответ дан Community 7 November 2019 в 12:01
поделиться
public void EnableDoubleBuffering()
{
   this.SetStyle(ControlStyles.DoubleBuffer | 
      ControlStyles.UserPaint | 
      ControlStyles.AllPaintingInWmPaint,
      true);
   this.UpdateStyles();
}
12
ответ дан Arno 7 November 2019 в 12:01
поделиться

Перед попыткой двойной буферизации посмотрите, решают ли SuspendLayout ()/ResumeLayout () проблему.

4
ответ дан Joel Coehoorn 7 November 2019 в 12:01
поделиться

Один путь состоит в том, чтобы расширить определенное управление, которое Вы хотите к двойному буферу и устанавливаете свойство DoubleBuffered в ctor управления.

, Например:

class Foo : Panel
{
    public Foo() { DoubleBuffered = true; }
}
8
ответ дан Jeff Hubbard 7 November 2019 в 12:01
поделиться

Можно также наследовать средства управления в собственные классы и установить свойство там. Этот метод также хорош, если Вы склонны делать много настроенных, которое является тем же на всех средствах управления.

1
ответ дан MagicKat 7 November 2019 в 12:01
поделиться

Я нашел, что просто установка установки DoubleBuffered на форме автоматически устанавливает все свойства, перечисленные здесь.

0
ответ дан Bhargav Rao 7 November 2019 в 12:01
поделиться

nobugz получает признание за метод в его ссылке, я просто репостю. Добавьте это переопределение в форму:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
    }
}

Это сработало лучше всего для меня, в Windows 7 у меня появлялись большие черные блоки, когда я изменял размер тяжелой формы элемента управления. Вместо этого элемент управления подпрыгивает! Но так лучше.

5
ответ дан 7 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

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