-1

Я использую «FlowLayoutPanel» для хранения сложного графического интерфейса. Эта структура содержит два типа UserControls:Зачем рисовать FlowLayoutPanel со сложными пользовательскими элементами управления?

  1. «S» Простой U.C (постоянный размер)
  2. «C» Другой FlowLayoutPanel, который может иметь те напечатать, как Чайлдс .. и так далее.

Когда у меня есть такой структуры:

1.С

  1. S
  2. S
  3. С:

    1.S

    2 .C

    1.S 
        2.S 
    

Она занимает около 15 секунд, чтобы сделать этот контроль, Каждый раз, когда этот контроль visble изменяет GUI не застревают на 15 + - секунд до его рендеринга целых компонентов.

* Примечание 1: Сложный элемент управления «C» имеет размер, который содержит FlowLayoutPanel. все «внутренние» компоненты «С» изменяют свою высоту при добавлении детей. главный \ master-контроль «C» получил размер исправления и имеет полосу прокрутки.

* Примечание 2: Я продлил FlowLayoutPanel иметь некоторые двойной буферизации оптимизаций:

общественного запечатанный класс FlowLayoutPanelEx: FlowLayoutPanel {

public FlowLayoutPanelEx() 
     : base() 
    { 
     this.SetStyle(ControlStyles.UserPaint, true); 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
    } 

    protected override void OnScroll(ScrollEventArgs se) 
    { 
     this.Invalidate(); 

     base.OnScroll(se); 
    } 

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

} 
+0

Сколько элементов управления находится в FLP? – TaW

+0

5 Простой и 3 комплекс. 8 итогов. Именно в том порядке, в котором я писал в вопросе. –

+0

Рендеринг 8 элементов управления __not__ занимает 15 секунд. Время должно идти куда-то еще. Почему вы делаете Invalidate в свитке? Кажется довольно странным для меня .. – TaW

ответ

0

решаемые переопределение "SuspendLayout" и «ResumeLayout ",

Когда мне нужно нарисовать этот элемент управления и ничего не изменилось, я вызываю функцию SuspendLayout, которая вызывает« Suspend » Макет "для каждого ребенка рекурсивно.

После того, как краска закончилась. Я вызываю «ResumeLayout», который делает то же самое.

Это приведет к тому, что пользователь будет контролировать не «RePaint» и рассчитать все дочерние/родительские размеры, а просто нарисовать элемент управления в том же состоянии, в котором он был раньше.

Уменьшить время рендеринга с 15 до 0,2 секунды :)

Смежные вопросы