Добавление детей на холст дает мне отставание - PullRequest
0 голосов
/ 14 февраля 2012

Ситуация / проблема

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

Когда количество элементов управления мало, все работает отлично. Элемент управления добавляется, и после этого срабатывает раскадровка, которая изменяет непрозрачность с 0 до 1 в течение 0,5 с. Однако, когда более чем 30/40 элементов управления «запаздывают», и первые 0,2 секунды раскадровки «пропускаются».

Существует элемент управления изображением с текстовым полем под ним.

Прежде чем элемент управления будет добавлен на холст, его сначала нужно создать.

Вопрос

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

Возможно, что-то с операцией ASync, которая создает элемент управления?

Любые идеи будут приветствоваться, но, если вы отправите идею, приведите небольшой пример.

MVVM Binding не является опцией.

Обновление

Способ получения нового элемента

        var control = new ElementControl(item);
        x = (x < 0) ? (GetWidth() * (i % GetCount())) : x;
        y = (y < 0) ? (GetHeight() * (i / GetCount())) : y;
        control.SetValue(Canvas.LeftProperty, x);
        control.SetValue(Canvas.TopProperty, y);
        control.SetValue(Canvas.ZIndexProperty, gbl.zIndex++);
        control.Drag_Completed += Element_Dropped;
        control.Drag_Started += Element_Dragging;
        control.DoubleClick += DoubleClick;
        return control;

в основном это только это. Элемент возврата добавляется на холст с помощью «Canvasname.Children.Add»

При создании элемента управления к нему добавляются события перетаскивания и перемещения.

Обновление 2

Раскадровка на элементе управления

<Storyboard x:Name="FadeIn">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Control"
                                   Storyboard.TargetProperty="Opacity">
        <EasingDoubleKeyFrame KeyTime="0:0:0"
                              Value="0" />
        <EasingDoubleKeyFrame KeyTime="0:0:1"
                              Value="1" />
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

Триггер раскадровки в mainpage.xaml.cs

MainCanvas.Children.Where(m => m.GetType() == typeof(ElementControl)).ToList().ForEach(m => (m as ElementControl).FadeIn.Begin());

1 Ответ

0 голосов
/ 14 февраля 2012

Создание элемента управления в другом потоке заставит вас плакать. Он выдает ошибку каждый раз, когда что-либо в пользовательском интерфейсе создается или иным образом затрагивается другим потоком. Создание элемента управления не должно занимать слишком много времени, поэтому я сомневаюсь, что проблема заключается в создании. Вы должны иметь возможность установить анимацию для объекта, который запускается после указанной задержки и запускается автоматически. Проблема также может заключаться в медленной работе плагина браузера, когда одновременно анимируется 30 или 40 объектов.

Может быть, вы можете опубликовать код, который поможет нам увидеть, если вы что-то упустили.

...