Возможность создания элемента управления Timeline с использованием Grid - PullRequest
3 голосов
/ 03 февраля 2011

Я хочу создать элемент управления WPF временной шкалы (как в этом (http://www.taterboy.com/blog/images/MotionEditor/classic_vs_custom.png) вид временной шкалы - для редактирования анимации).

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

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

Хотя я ничего не знаю об этом элементе управления, и я впервые использую WPF, поэтому мне было интересно, кто-нибудь может прокомментировать эту идею?

В частности, с точки зрения производительности, сетка предназначена для использования таким образом, или это больше для структурирования графического интерфейса во время разработки? Буду ли я подвергаться серьезному снижению производительности, пытаясь изменить его конфигурацию динамически, с большим количеством элементов? (~ 2000-3000 было бы вероятным наихудшим случаем)

С точки зрения кодирования, насколько легко изменить сетку? И делать такие вещи, как затенение клеток, например? Это просто вопрос Grid.NumberOfColumns = x или каждый элемент должен быть уникальным объектом?

Спасибо за любые идеи!

1 Ответ

3 голосов
/ 03 февраля 2011

Использование Grid, безусловно, является опцией, и работа с Grid в XAML и коде довольно проста.

    <Grid Name="MyGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
    </Grid>

    MyGrid.ColumnDefinitions.Add(new ColumnDefinition() 
              { Width = new GridLength(0, GridUnitType.Star) });

Затем вы можете использовать Rectangle, чтобы позаботиться о вашем затенении.

<Rectangle Grid.Column="0"></Rectangle>

Проблема сводится к производительности, однако вы можете справиться в зависимости от множества факторов. Если производительность является помехой, другой подход может заключаться в использовании VirtualizingStackPanel в качестве базового контейнера макета в ItemsControl , поскольку он будет учитывать виртуализацию пользовательского интерфейса . Виртуализация данных также может стать проблемой и должна быть устранена после визуализации пользовательского интерфейса через VirtualizingStackPanel. ItemsControl позволит вам предоставить DataTemplate для элементов и в долгосрочной перспективе будет лучшим подходом к использованию Grid на основе вашего первоначального утверждения относительно размера.

Expression Blend был построен с использованием WPF и имеет обширную поддержку анимации; включая интерактивную и надежную временную шкалу, так что это может быть сделано. Понимание WPF является ключом, в противном случае вы будете в конечном итоге рефакторинг вашего первоначального подхода по мере роста вашего понимания. Постарайтесь, если можете, найти достойную основу для отличия WPF от WinForms (это существенно), поскольку это облегчит вашу жизнь в будущем.

...