Как лучше всего создать пользовательский элемент управления C# с анимацией без мерцания?

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

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

myCustomControl.left -= m_iSpeed;

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

Итак, вот вопрос: Как лучше всего создать анимированный элемент управления C# без мерцания? Должен ли я просто не создавать настраиваемые элементы управления и обрабатывать весь рисунок в фоновом изображении панели, которое я генерирую? Есть ли метод супер-анимации, который я не обнаружил? :)

Спасибо!

Какой набор инструментов GUI вы используете?

Serafina Brocious 08.10.2008 16:03

Он упоминает C#, поэтому я думаю, что мы, скорее всего, говорим о .Net Windows Forms. Я думаю, что DoubleBuffering - это ответ, но сейчас я не вспоминаю подробностей.

Jonathan Rupp 08.10.2008 16:19

Правильно, я использую стандартные формы Windows .net.

koni 08.10.2008 16:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
7 877
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Вы можете попытаться вызвать this.SuspendLayout (); перед тем, как начать движение, и this.ResumeLayout (ложь);, когда вы закончите перемещение всех элементов управления. Таким образом, все элементы управления должны отображаться одновременно, и мерцание должно быть меньше.

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

Обычный способ получить анимацию без мерцания - реализовать двойную буферизацию. Взгляните на эту статью Code Project

http://www.codeproject.com/KB/GDI-plus/flickerFreeDrawing.aspx

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

Ответ принят как подходящий

Лучше всего для анимации без мерцания рисовать самостоятельно (использовать объект Graphics в обработчике событий Paint) и использовать двойную буферизацию. В вашем настраиваемом элементе управления вам понадобится такой код в конструкторе:

this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | 
    ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor,
    true);

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