Windows phone 7 如何在photochooser任务中调用MessageBox

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

我有一个在WP7中调用photochooser的代码,当pic超过2Mb时,我想向用户显示一个messagebox。当我尝试这样做时,由于photochooser任务在后台运行,我们开始得到未处理的异常

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
。一旦我们从照片选择器任务或照相机任务返回,页面加载事件不会触发…让我检查调用此对焦事件。