即使我在Dispatcher.BeginInvoke中包装它,我也会得到一个错误

本文关键字:错误 一个 Dispatcher BeginInvoke 包装 | 更新日期: 2023-09-27 17:52:11

在c#中,我试图在我的应用程序中淡出Image。这是MainPage中的图像。一开始效果很好。但是如果我导航到另一个站点,比如Settings.xaml,然后回到MainPage, Dispatcher抛出 Invalid cross-thread access.

任何人都有一个想法,这就是我如何试图设置我的BackgroundWorker_DoWork函数的图像不透明度:

Dispatcher.BeginInvoke(() =>
                    {
                        MyImage.Opacity = opacity;
                    });

有趣的是,它没有坏,但是在它上面放了一个breakpoint,它说一切都是 Invalid cross-thread access.

即使我在Dispatcher.BeginInvoke中包装它,我也会得到一个错误

尝试使用动画实现衰落逻辑,而不是BackgroundWorker。这可能会有所帮助。

你试过这种方法吗?

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

WP7 Transitions in depth |关键概念和API

WP7深度过渡|自定义过渡

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

试试这个:

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();
        }));
    }
相关文章: