none
弹出MessageDialog对话框无任何反应 RRS feed

  • 问题

  • 我注册一个事件,随时检查网络变动

    Windows::Foundation::EventRegistrationToken	m_checkNetEventToken;
    
    m_checkNetEventToken=(m_netTracker->nwscnHandler += ref new NetWorkStatusChangeNotifyHandler(this,&NetDiskMainPage::CheckNetHandler));
    

    当网络断开时,调试是可以进入到以下的检测函数,并且执行了显示对话框的操作,但是界面却没有任何反应,请教各位大牛,有什么解决方法吗?

    void XXX::NetDiskMainPage::CheckNetHandler(ISpaceSdkService::NetTracker ^netTracker)
    {
    //网络状态发生变动
    	Windows::Networking::Connectivity::NetworkConnectivityLevel networkType = netTracker->GetCurrentNetWorkType();
    	if(networkType != Windows::Networking::Connectivity::NetworkConnectivityLevel::InternetAccess)
    	{
    		MessageDialog^msg = ref new MessageDialog(L"无网络连接或网络繁忙",MCLOUD_ERRORMESS_TITLE);
    		msg->DefaultCommandIndex = 0;
    		msg->ShowAsync();
    	}
    }

    2013年12月21日 8:40

全部回复

  • Hi pingglala,

    我对C++编写windows store app不是很熟悉,不过我认为应该是你MessageDialog的构造函数出了问题。

    我对你的代码进行了下修改,把引用的string变成了字符串

    	MessageDialog^msg = ref new MessageDialog(L"无网络连接或网络繁忙", "我是标题啊 ");
    	msg->DefaultCommandIndex = 0;
    	msg->ShowAsync();
    

    结果是没有问题的。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年12月22日 4:23
    版主
  • 谢谢版主的回复,

    我程序其他地方也是这么用的,都是可以弹出的,弹出对话框只能在界面线程执行对吧?

    刚查了一下,发觉界面线程里面,或者是按钮按下的处理函数里面都是正常弹出的。

    然后我想,可能EventRegistrationToken是后台线程, 所以我改成在界面延续线程里面弹出,

    task<void>([this,netTracker ]{ wait(1);}).then([this,netTracker ](){
    		int A=0;
    		Windows::Networking::Connectivity::NetworkConnectivityLevel networkType = netTracker->GetCurrentNetWorkType();
    			if(networkType != Windows::Networking::Connectivity::NetworkConnectivityLevel::InternetAccess)
    			{
    				MessageDialog^msg = ref new MessageDialog(L"无网络连接或网络繁忙","标题");
    				msg->DefaultCommandIndex = 0;
    				msg->ShowAsync();
    			}
    	
    	},task_continuation_context::use_current());

    但是执行到msg->ShowAsync();就报错了,HRESULT:0x80070490。应该是线程问题,版主对此了解么?

    查看调用堆栈如下

    2013年12月23日 3:10
  • 你好 pingglala,

    当你需要从一个工作线程更新UI 线程的时候,你需要使用 CoreDispatcher.RunAsync 方法。

    使用该方法你需要准备一个回调函数来更新UI。大概代码如下:

    _dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, 
                         ref new Windows::UI::Core::DispatchedHandler([this]()
    {
      _count++;
      TimerTextBlock->Text = "Total Running Time: " + _count.ToString() + " Seconds";
    }));
    

    你可以在如下文章中了解更多关于dispatch的内容:

    http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.core.coredispatcher.runasync.aspx

    谢谢你对论坛的支持!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月24日 3:37
    版主
  • thanks XiaoLiang,

    我已经将对话框改成在 CoreDispatcher.RunAsync 里面调用,还是会崩溃 

    void XXX::YYY::CheckNetHandler(ISpaceSdkService::NetTracker ^netTracker)
    {
    
    //网络状态发生变动
    
    	Windows::Networking::Connectivity::NetworkConnectivityLevel networkType = netTracker->GetCurrentNetWorkType();
    	if(networkType == Windows::Networking::Connectivity::NetworkConnectivityLevel::None)
    	{
    		IsCanShowMsgBox=false;
    		MessageDialog^ msg = ref new MessageDialog(L"无网络",MCLOUD_ERRORMESS_TITLE);
    		msg->DefaultCommandIndex = 0;
    		Windows::UI::Core::CoreDispatcher^ c;
    		c->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, 
    			ref new Windows::UI::Core::DispatchedHandler([msg]()
    		{
    			msg->ShowAsync();
    		}));
    	}
    }

    经观察,此函数会同时运行多次,可以是多次同时弹出对话框引起的崩溃,而我设一个全局变量来同步也失败了。

    程序编译时提示:  版主能看出什么解决方法不?十分感谢。

     warning C4451: “MCloudForWin8::NetDiskMainPage::CheckNetHandler::<lambda_5e4f44b784a327b98bd4f668a3aee6ee>::msg”: 在此上下文中使用 ref 类“Windows::UI::Popups::MessageDialog”会导致上下文中的对象的封送处理无效 (NetDiskMainPage.xaml.cpp)
    2>          考虑改用“Platform::Agile<Windows::UI::Popups::MessageDialog>
    2013年12月26日 9:13
  • 你好 pingglala,

    同时弹出多个对话框是毫无道理的,而且对话框会让UI线程阻塞,本身商店应用就不提倡使用该机制,更不用说弹出多个了。所以我们并没有提供弹出多个对话框的支持。

    当你弹出一个以上的对话框的时候都会提示内存访问异常。

    用全局变量来进行多线程的同步是可行的。但是我看你代码中只是改变了值,并没有进行判断的语句啊。这样使用比较好:

    your function(){
    
        if( isshow){
       
             isshow=false;
             .......
             //after the user click the OK button
            isshow=true;
        }

    我虽然将 isshow=true 写在了里面,但它并不应该写在此处,他应该写在OK 按钮事件的回调里。因为这里是异步调用show,所以在用户点击ok按钮之前,应该阻止其他线程对该函数的访问。

    希望上面的回复能够帮到你!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    2013年12月26日 12:14
    版主
  • thanks xiaoliang,

    我已经按照你的提示做了,

    void MCloudForWin8::NetDiskMainPage::CheckNetHandler(ISpaceSdkService::NetTracker ^netTracker)
    {
    
    //网络状态发生变动
    	if(!m_isShowNeting)
    	{
    		m_isShowNeting=true;
    
    		Windows::Networking::Connectivity::NetworkConnectivityLevel networkType = netTracker->GetCurrentNetWorkType();
    		if(networkType != Windows::Networking::Connectivity::NetworkConnectivityLevel::InternetAccess)
    		{
    			MessageDialog^msg = ref new MessageDialog(L"无网络连接或网络繁忙","标题");
    			UICommand^ upgradeCommand = ref new UICommand(
    				"确定", ref new UICommandInvokedHandler(this, &NetDiskMainPage::MCloudMessageDialogEnter));
    			msg->Commands->Append(upgradeCommand);
    			msg->DefaultCommandIndex = 0;
    			Windows::UI::Core::CoreDispatcher^ c;
    			c->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, 
    				ref new Windows::UI::Core::DispatchedHandler([msg]()
    			{
    				msg->ShowAsync();
    			}));
    
    			//msg->ShowAsync();
    		}
    		else
    		{
    			m_isShowNeting=false;
    		}
    	}
    
    
    	
    }

    经调试,是

    Windows::UI::Core::CoreDispatcher^ c;
    c->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal,
    ref new Windows::UI::Core::DispatchedHandler([msg]()
    {
        msg->ShowAsync();
    }));

     这里导致的崩溃,  是不是我这个东西没有用对呢?请大神指示~~万分感谢。

    2013年12月31日 4:10
  • 你好 pingglala,

    你的使用方法是错误的。你应该使用当前线程的dispatcher,而不是自定义一个。

    请按照这个用法来用:

    CoreWindow::GetForCurrentThread()->Dispatcher->RunAsync();

    希望上述能帮到你。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月31日 5:41
    版主
  • XiaoLiang你好,非常感谢回复,也十分抱歉这几天没过来处理问题,我现在按照你的方式试了,但是还是会core掉,显示是在 Windows::UI::Core::ICoreWindow::Dispatcher::get()这里崩溃的。

    我是注册一个事件来随时检查网络的,

    Windows::Foundation::EventRegistrationToken m_checkNetEventToken;
    m_checkNetEventToken=(m_netTracker->nwscnHandler += ref new NetWorkStatusChangeNotifyHandler(this,&NetDiskMainPage::CheckNetHandler));

    弹出对话框是在CheckNetHandler函数里面的, 请问版主能看出什么问题么?十分感谢!

    void XXX::NetDiskMainPage::CheckNetHandler(ISpaceSdkService::NetTracker ^netTracker)
    {
    
    //网络状态发生变动
    	if(!m_isShowNeting)
    	{
    		m_isShowNeting=true;
    
    		Windows::Networking::Connectivity::NetworkConnectivityLevel networkType = netTracker->GetCurrentNetWorkType();
    		if(networkType != Windows::Networking::Connectivity::NetworkConnectivityLevel::InternetAccess)
    		{
    			MessageDialog^msg = ref new MessageDialog(L"无网络连接或网络繁忙","标题");
    			UICommand^ upgradeCommand = ref new UICommand(
    				"确定", ref new UICommandInvokedHandler(this, &NetDiskMainPage::MCloudMessageDialogEnter));
    			msg->Commands->Append(upgradeCommand);
    			msg->DefaultCommandIndex = 0;
    			
    			Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher->
    				RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, 
    				ref new Windows::UI::Core::DispatchedHandler([msg]()
    			{
    				try
    				{
    				msg->ShowAsync();
    				}
    				catch(Exception^e)
    				{
    					int a;
    				}
    			}));
    			}
    			
    			
    		}
    		else
    		{
    			m_isShowNeting=false;
    		}
    }
    

    2014年1月7日 3:55