Вызывающий поток не может получить доступ к этому объекту - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь создать таймер, который возвращает в главное меню моего приложения 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 ]

2 голосов
/ 05 марта 2012

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

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);   
     });
}
1 голос
/ 05 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...