我尝试在我的应用程序中实现登录。我需要登录页面开始加载之前,因为当一切都好我去第二页,如果不是第一页。为此,我这样设置WMAppManifest:
<DefaultTask Name="_default" NavigationPage="" />
当我执行async方法时,并行应用程序开始加载页面,但它是空的,所以我的应用程序冻结。
如何看我的Application_Launching:
private async void Application_Launching(object sender, LaunchingEventArgs e)
{
bool logged = await LogIn("login", "pass");
Uri nUri = null;
if (logged)
{
nUri = new Uri("/SecondPage.xaml", UriKind.Relative);
}
else
{
nUri = new Uri("/FirstPage.xaml", UriKind.Relative);
}
((App)Application.Current).RootFrame.Navigate(nUri);
}
async方法LogIn:
private async Task<bool> LogIn(string login, string password)
{
string str_login_number = login;
string str_login_pass = password;
JObject jo = new JObject();
jo.Add("number", str_login_number);
jo.Add("pass", str_login_pass);
JsonWorker jWorker = new JsonWorker();
var response = await jWorker.sendJSON("url", jo);
string str_responseformjson = await jWorker.getJSON(response);
jo = JObject.Parse(str_responseformjson);
if (jo["response"].ToString().Equals("ok"))
{
return true;
}
else
{
return false;
}
}
这是我的类JsonWorker的代码:
class JsonWorker
{
public async Task<HttpWebResponse> sendJSON(string requestUrl, JObject jsonObjesct)
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(requestUrl);
request.ContentType = "text/plain; charset=utf-8";
request.Method = "POST";
byte[] jsonAsBytes = Encoding.UTF8.GetBytes(jsonObjesct.ToString());
Stream x = await request.GetRequestStreamAsync();
await x.WriteAsync(jsonAsBytes, 0, jsonAsBytes.Length);
x.Close();
HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync());
return response;
}
public async Task<string> getJSON(
HttpWebResponse response)
{
var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
string str_responsefromjson = await sr.ReadToEndAsync();
sr.Close();
stream.Close();
return str_responsefromjson;
}
}
请帮助。
我有一些工作流程在我的一个应用程序。我通过使用自定义UriMapper解决了这个问题。阅读这个Stackoverflow回答以获得更多信息。
这是基本的。UriMapper根据用户是否已经输入了正确的登录凭据来处理导航到哪个页面。如果之前已经给出了正确的凭据,那么应用程序中的激活和启动事件将始终登录。
private void Application_Launching(object sender, LaunchingEventArgs e)
{
RootFrame.UriMapper = new LoginUriMapper();
if (AppSettings.HasLoginInfo)
{
Login();
}
}
private void Application_Activated(object sender, ActivatedEventArgs e)
{
if (e.IsApplicationInstancePreserved == false)
{
// tombstoned! Need to restore state
RootFrame.UriMapper = new LoginUriMapper();
if (AppSettings.NotLoggedIn)
{
Login();
}
}
}
如果登录失败,MainPage将处理逻辑,然后向后导航到登录页面。导航到登录页面时,始终记得从导航堆栈中删除任何条目
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
while(NavigationService.CanGoBack)
{
NavigationService.RemoveBackEntry();
}
}