即使我在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.
尝试使用动画实现衰落逻辑,而不是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();
}));
}