我尝试在我的应用程序中实现登录。我需要在页面开始加载之前登录,因为当一切正常时我会转到第二页,如果不是第一页。为此,我将WMAppManifest设置为:
<DefaultTask Name="_default" NavigationPage="" />
当我执行我的异步方法时,paralel应用程序启动加载页面但它是空的,所以我的应用程序冻结。
如何查看我的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);
}
异步方法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;
}
}
请求帮助。
答案 0 :(得分:0)
我在其中一个应用中有一些工作流程。我通过使用自定义UriMapper解决了这个问题。有关详细信息,请阅读此Stackoverflow answer。
这是基础知识。 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();
}
}