2013-05-09 4 views
1

Я пытаюсь сделать System.Windows.Shapes.Rectangle вращение по оси Y, имитирующую вращение карты, показывая весь маршрут.UI refresh looping a Dispatcher.BeginInvoke

Проблема в том, что пользовательский интерфейс обновляется только в конце.

Упрощенная версия кода

Вызов метода

for (i=0; i<=180; i++) 
{ 
    int j = i; 
    Dispatcher.BeginInvoke(new a_dispatcher(() => { 
      print_animation_of_card(card, i); 
     }), 
     null); 
} 

Метод

private void print_animation_of_card(System.Windows.Shapes.Rectangle card) 
{ 
    ... 
    System.Windows.Media.PlaneProjection p = 
     card.Projection as System.Windows.Media.PlaneProjection; 
    p.RotationY = i; 
    card.Projection = p; 
} 

Я также попытался поставить FOR в метод, с таким же результат ...

Как мне сделать, чтобы показать все вращение системы.Windows.Shapes.Rectangle?

ответ

0

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

Попробуйте с Dispatcher.Invoke() или поместите всю петлю внутри одного Dispatcher.BeginInvoke() и посмотрите, являются ли результаты более полезными.

+0

Я работаю с Silverlight, так Invoke() метод не доступен ... Я пытался ставить петлю внутри Dispatcher.BeginInvoke(), но без результата, я заставил его работать, поставив Dispatcher.BeginInvoke() в Backgroundworker, но я бы предпочел, чтобы он работал без многопоточности ... –

+0

@Korbert. Если вы не используете «BackgroundWorker», то зачем использовать 'Dispatcher.BeginInvoke()' вообще? Вы должны иметь возможность напрямую манипулировать картой «Прямоугольник». – Jay

+0

Да, но я хочу показать пользователю анимацию вращения Rectangle. Если я делаю это нормально без диспетчера, я вижу только конечную позицию. Я думал, что смогу показать все движения Dispatcher.BeginInvoke(), я ошибаюсь? –

0

Наконец-то я сделал это с BackgroundWorker, спасибо @Jay за ответы.

Вызов метода

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += (object sender, DoWorkEventArgs e) => 
{ 
    print_animation_of_card(card); 
}; 
bw.RunWorkerAsync(); 

Метод

private void print_animation_of_card(System.Windows.Shapes.Rectangle card) 
{ 
    for (int i = 0; i <= 180; i++) 
    { 
     Thread.Sleep(3); 
     Dispatcher.BeginInvoke(new a_dispatcher(() => 
     { 
      //same code as topic method code 
     }),null); 
    } 
} 

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

  • Нет связанных вопросов^_^