2012-03-04 3 views
0

Я пытаюсь создать таймер, который возвращается в главное меню моего приложения WPF, скажем, 30 секунд бездействия. Но я получаю сообщение об ошибке «Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток». и это происходит в FadeOut() по адресу storyboard.Begin(uc);Вызывающий поток не может получить доступ к этому объекту

Я видел несколько решений, связанных с привлечением диспетчера, но я не уверен, как подать заявку в моем случае?

public void ResetScreen() 
{ 
    if (!mainScreen) 
    { 
     Timer myTimer = new Timer(); 
     myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     myTimer.Interval = 1000; 
     myTimer.Start(); 
    } 
} 

private void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    TransitionContent(oldScreen, newScreen); 
} 

private void FadeIn(FrameworkElement uc) 
{ 
    DoubleAnimation dAnimation = new DoubleAnimation(); 
    dAnimation.Duration = new Duration(TimeSpan.FromSeconds(1.0)); 
    dAnimation.From = 0; 
    dAnimation.To = 1; 
    Storyboard.SetTarget(dAnimation, uc); 
    Storyboard.SetTargetProperty(dAnimation, new PropertyPath(OpacityProperty)); 
    Storyboard storyboard = new Storyboard(); 
    storyboard.Children.Add(dAnimation); 
    storyboard.Begin(uc); 
} 

private void FadeOut(FrameworkElement uc) 
{ 
    DoubleAnimation dAnimation = new DoubleAnimation(); 
    dAnimation.Duration = new Duration(TimeSpan.FromSeconds(1.0)); 
    dAnimation.From = 1; 
    dAnimation.To = 0; 
    Storyboard.SetTarget(dAnimation, uc); 
    Storyboard.SetTargetProperty(dAnimation, new PropertyPath(OpacityProperty)); 
    Storyboard storyboard = new Storyboard(); 
    storyboard.Children.Add(dAnimation); 
    storyboard.Begin(uc); 
} 

private void TransitionContent(FrameworkElement oldScreen, FrameworkElement newScreen) 
{ 
    FadeOut(oldScreen); 
    FadeIn(newScreen); 
} 

ответ

2

Это один может быть решением:

this.Dispatcher.Invoke((Action)(()=>{ 
     // In here, try to call the stuff which making some changes on the UI 
}); 

Такие, как:

private void TransitionContent(FrameworkElement oldScreen, FrameworkElement newScreen) 
{ 
    this.Dispatcher.Invoke((Action)(()=>{ 
      FadeOut(oldScreen); 
      FadeIn(newScreen); 
    }); 
} 
+0

Это решение работает, спасибо. – Michael

1

Ваша проблема в том, что событие System.Timers.Timer работает на потоке, отличном от UI нить. Вы можете попробовать напрямую вызвать, как упомянули другие, или вы можете использовать DispatcherTimer.

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

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