Windows phone 7 如何在photochooser任务中调用MessageBox
我有一个在WP7中调用photochooser的代码,当pic超过2Mb时,我想向用户显示一个messagebox。当我尝试这样做时,由于photochooser任务在后台运行,我们开始得到未处理的异常Windows phone 7 如何在photochooser任务中调用MessageBox,windows-phone-7,messagebox,dispatcher,Windows Phone 7,Messagebox,Dispatcher,我有一个在WP7中调用photochooser的代码,当pic超过2Mb时,我想向用户显示一个messagebox。当我尝试这样做时,由于photochooser任务在后台运行,我们开始得到未处理的异常 void photoChooserTask_Completed(object sender, PhotoResult e) { if (e.ChosenPhoto != null) { ProgressBar.Visibility = Visib
void photoChooserTask_Completed(object sender, PhotoResult e)
{
if (e.ChosenPhoto != null)
{
ProgressBar.Visibility = Visibility.Visible;
image = _UploadImgeViewModel.ReadToEnd(e.ChosenPhoto);
if (image.Length < 16384)
{
BitmapImage bi = new BitmapImage();
bi.SetSource(e.ChosenPhoto);
UserSession.ProfileImage = bi;
Session.PreviousImage = bi;
UserSession.isImageChanged = true;
UserSession.image = image;
UserSession.Uploadimage = image;
NavigationService.Navigated += new NavigatedEventHandler(navigateCompleted);
}
else
{
ProgressBar.Visibility = Visibility.Collapsed;
UserSession.isImageChanged = false;
UserSession.ProfileImage = null;
Dispatcher.BeginInvoke(() => MessageBox.Show("The message"));
}
}
}
#endregion
void photoChooserTask_已完成(对象发送方,photosult e)
{
如果(e.ChosenPhoto!=null)
{
ProgressBar.Visibility=可见性.Visibility;
image=\u上传imgeviewmodel.ReadToEnd(e.ChosenPhoto);
如果(图像长度<16384)
{
BitmapImage bi=新的BitmapImage();
bi.SetSource(如ChosenPhoto);
UserSession.ProfileImage=bi;
Session.PreviousImage=bi;
UserSession.isImageChanged=true;
UserSession.image=image;
UserSession.Uploadimage=image;
NavigationService.Navigated+=新的NavigatedEventHandler(navigateCompleted);
}
其他的
{
ProgressBar.Visibility=Visibility.collazed;
UserSession.isImageChanged=false;
UserSession.ProfileImage=null;
Dispatcher.BeginInvoke(()=>MessageBox.Show(“消息”);
}
}
}
#端区
这仅显示正在恢复的后台作业。。。还有前景中的味精盒。几秒钟后,应用程序崩溃。
你能帮我一下吗?你有10秒的时间完全返回前台,否则你的应用程序将被杀死。如果您有一个messagebox可以显示在这里,您将无法通过认证(因为用户在10秒钟内无法单击任何内容)——您需要等待页面加载 如果需要显示MessageBox,解决方法是设置bool,并在页面的Loaded事件中选中它
void photoChooserTask_Completed(object sender, PhotoResult e) { if (e.ChosenPhoto != null) { ProgressBar.Visibility = Visibility.Visible;
image = _UploadImgeViewModel.ReadToEnd(e.ChosenPhoto);
if (image.Length < 16384)
{
BitmapImage bi = new BitmapImage();
bi.SetSource(e.ChosenPhoto);
UserSession.ProfileImage = bi;
Session.PreviousImage = bi;
UserSession.isImageChanged = true;
UserSession.image = image;
UserSession.Uploadimage = image;
NavigationService.Navigated += new NavigatedEventHandler(navigateCompleted);
}
else
{
ProgressBar.Visibility = Visibility.Collapsed;
UserSession.isImageChanged = false;
UserSession.ProfileImage = null;
//set flag
UserSession.ImageTooBig = true;
}
}
}
#endregion
MyPage()
{
//make sure you attach Loaded Event if not already
Loaded += (s,e) =>
{
if (UserSession.ImageTooBig)
{
UserSession.ImageTooBig = false;
MessageBox.Show("Sorry, the image exceeds 2 MB");
}
};
}
void photoChooserTask_已完成(对象发送方,PhotoResult e){if(e.ChosenPhoto!=null){ProgressBar.Visibility=Visibility.Visible;
image=\u上传imgeviewmodel.ReadToEnd(e.ChosenPhoto);
如果(图像长度<16384)
{
BitmapImage bi=新的BitmapImage();
bi.SetSource(如ChosenPhoto);
UserSession.ProfileImage=bi;
Session.PreviousImage=bi;
UserSession.isImageChanged=true;
UserSession.image=image;
UserSession.Uploadimage=image;
NavigationService.Navigated+=新的NavigatedEventHandler(navigateCompleted);
}
其他的
{
ProgressBar.Visibility=Visibility.collazed;
UserSession.isImageChanged=false;
UserSession.ProfileImage=null;
//设旗
UserSession.ImageTooBig=true;
}
}
}
#端区
MyPage()
{
//如果尚未附加加载的事件,请确保附加该事件
加载+=(s,e)=>
{
if(UserSession.ImageTooBig)
{
UserSession.ImageTooBig=false;
Show(“对不起,图像超过2MB”);
}
};
}
很酷。我有办法解决这个问题。可能不是一个解决方案,但这样我们可以避免这个问题。只需添加一个按钮,并在按钮单击事件中执行验证过程。因为我们无法在导航过程中显示消息框
代码如下:
void photoChooserTask_Completed(object sender, PhotoResult e)
{
if (e.ChosenPhoto != null)
{
ProcessSelectedImage(e.ChosenPhoto);
}
}
private void ProcessSelectedImage(Stream stream)
{
if (stream != null)
{
bi.SetSource(stream);
UserSession.ProfileImage = bi;
UserSession.PreviousImage = bi;
image = ConvertToImage.ReadToEnd(stream);
UserSession.image = image;
UserSession.Uploadimage = image;
}
}
private void UploadImage_Click(object sender, RoutedEventArgs e)
{
if (image.Length < 16384)
{
UserSession.isImageChanged = true;
UserSession.image = image;
UserSession.Uploadimage = image;
NavigationService.Navigate(new Uri("/Views/EditMyProfile.xaml", UriKind.Relative));
}
else
{
UserSession.isImageChanged = false;
UserSession.ProfileImage = null;
UserSession.IsChangingProfilePicture = true;
MessageBox.Show(MessageContent.ImageUploadLengh);
}
}
void photoChooserTask_已完成(对象发送方,photosult e)
{
如果(e.ChosenPhoto!=null)
{
ProcessSelectedImage(如ChosenPhoto);
}
}
私有无效进程SelecteImage(流)
{
if(流!=null)
{
bi.SetSource(stream);
UserSession.ProfileImage=bi;
UserSession.PreviousImage=bi;
image=ConvertToImage.ReadToEnd(流);
UserSession.image=image;
UserSession.Uploadimage=image;
}
}
私有无效上载映像\u单击(对象发送方,路由目标)
{
如果(图像长度<16384)
{
UserSession.isImageChanged=true;
UserSession.image=image;
UserSession.Uploadimage=image;
NavigationService.Navigate(新Uri(“/Views/EditMyProfile.xaml”,UriKind.Relative));
}
其他的
{
UserSession.isImageChanged=false;
UserSession.ProfileImage=null;
UserSession.IsChangingProfilePicture=true;
MessageBox.Show(MessageContent.ImageUploadLengh);
}
}
谢谢
Kamal为什么要在后台运行
PhotochooserTask
?你会遇到什么错误?你有10秒钟的时间完全返回前台,否则你的应用程序将被杀死。如果你有一个消息框可以显示在这里,你将无法通过认证(因为用户在10秒钟内无法单击任何东西)——你需要等待页面加载。我只是使用photochooser任务在我的应用程序中上载用户的个人资料img。在这样做时,我想向用户显示一个消息,即当photochooser仍在后台运行时,图像超过2Mb。事实上,MessageBox停止了photochooser,我看到正在恢复。。。后面的进度条会导致应用程序崩溃。当我删除这个消息框时,没有崩溃seenWellmel-我想这就是正在发生的事情。你能告诉我什么是解决方法吗?PhotoChooserTask返回到你的应用程序后不再运行。您在代码中的什么地方上载内容?在您的代码中,没有理由对MessageBox使用Dispatcher.BeginInvoke
。一旦我们从照片选择器任务或照相机任务返回,页面加载事件不会触发…让我检查调用此对焦事件。