即使我将它包装在Dispatcher.BeginInvoke中,我也会收到错误

时间:2013-01-12 17:28:38

标签: c# windows-phone-7 backgroundworker windows-phone-8

在c#中,我试图在我的应用程序中淡出Image。它是MainPage中的图像。起初它很棒。但是,如果我导航到其他网站,请说Settings.xaml,然后返回MainPage,调度程序会抛出 Invalid cross-thread access.

任何人都有了想法,这就是我在BackgroundWorker的{​​{1}}函数中设置图像不透明度的方式:

_DoWork

有趣,它不会破坏,但会在其上加上Dispatcher.BeginInvoke(() => { MyImage.Opacity = opacity; }); ,并说明所有内容都是 breakpoint

2 个答案:

答案 0 :(得分:1)

尝试使用Animation而不是BackgroundWorker来实现淡入淡出逻辑。它可能有所帮助。

你试过这种方式吗?

使用Windows Phone Toolkit的另一种方式:

WP7 Transitions in depth | key concepts and API

WP7 Transitions in depth | custom transitions

这是旧文章,但它们可能包含有用的信息。

答案 1 :(得分:1)

试试这个:

Dispatcher.Invoke(DispatcherPriority.ContextIdle, new Action(delegate()
        {
            //your code in another thread you want to invoke in UI thread
        }));

您应该从UI线程调用它,例如从MainWindow调用它。 从我的项目:

//Event raised on ImageSource property changed while Backgroundwoker in MainWindow class:
    void binding_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        MyProject.ImageCropSize crop = MyProject.ImageCropSize.SourceCrop;

        this.Dispatcher.Invoke(DispatcherPriority.ContextIdle, new Action(delegate()
        {
            BitmapImage bmisource = image1.Source as BitmapImage;
            bmisource = null;//new BitmapImage();
            GC.Collect();

            BitmapImage bmi = MyProject.ImageData.ConvertFromBitmapToBitmapImage(((ImageBinding)sender).BitMap, crop);
            image1.Source = bmi;
            ((ImageBinding)sender).Clear();

        }));
    }