如何做Windows Phone的登錄/注冊功能
首先我要做的效果如下
思路一:page
在WP里Page是最基本的東西,你第一想法肯定是用Page來做登錄注冊。但是登錄注冊其實是不太適合用Page來做,關于login screen/splash screen的分析,且看這篇著名博文Introducing the concept of “Places”,在看完后想想用popup來做.登錄注冊頁面在很多地方會被調用到,使用page會導致頁面間跳轉邏輯比較亂。
思路二:popup
popup只是個容器,設置Child為什么都可以,然后IsOpen=true;就顯示出來了。
問題一:popup的Child可以是page嗎?
答案是可以的。
signInUpPopup = new Popup(); //SignInUp為Page,改造過了 Guanjia.Views.SignInUp signInUp = new Guanjia.Views.SignInUp(this, signInUpPopup, 480, 728, 0);//this); //這個不用解釋了 signInUpPopup.Child = signInUp; signInUpPopup.IsOpen = true;然后更多問題出來了。
問題二:
當按下BackKey鍵的時候,Popup出來的頁面連同父Page全部關掉了,不是我們期望的Popup消失的效果。所以要處理下。
private void doSignInUp() { signInUpPopup = new Popup(); //SignInUp為Page,改造過了 Guanjia.Views.SignInUp signInUp = new Guanjia.Views.SignInUp(this, signInUpPopup, 480, 728, 0);//this); //登錄注冊成功后回調了 signInUp.OnSuccess += new EventHandler(signInUp_OnSuccess); //這個不用解釋了 signInUpPopup.Child = signInUp; //一下三行處理BackKey沖突 signInUpPopup.Loaded += new RoutedEventHandler(signInUpPopup_Loaded); signInUpPopup.Unloaded += new RoutedEventHandler(signInUpPopup_Unloaded); signInUpPopup.Closed += new EventHandler(signInUpPopup_Closed); signInUpPopup.IsOpen = true; }
void signInUpPopup_Unloaded(object sender, RoutedEventArgs e) { //草草草 沒被調用 Debug.WriteLine("Popup Unloaded here"); this.BackKeyPress += Main_BackKeyPress; } public void AddBackKeyPressHandle() { this.BackKeyPress += Main_BackKeyPress; } void signInUpPopup_Loaded(object sender, RoutedEventArgs e) { this.BackKeyPress -= Main_BackKeyPress; } void signInUpPopup_Closed(object sender, EventArgs e) { Debug.WriteLine("Popup closed here"); this.BackKeyPress += Main_BackKeyPress; } void signInUpPopup_Opened(object sender, EventArgs e) { this.BackKeyPress -= Main_BackKeyPress; }問題三:Popup出來的Page的ApplicationBar不對(在父Page里我沒設ApplicationBar,所以popup出來也沒有 ApplicationBar),popup出來的page可以有ApplicationBar嗎?我跑到stackoverflow一問: Is it possible to popup a sigin/up page(pivot) with appbar?。得到答案可以。
以下為改造過的登錄頁面
public partial class SignInUp : PhoneApplicationPage { private PhoneApplicationPage page = null; private IApplicationBar parentAppBar = null; private Popup popup = null; //public static event EventHandler OnSuccess; public SignInUp() { InitializeComponent(); page = this; } public SignInUp(PhoneApplicationPage parentpage, Popup popup, int width, int height, int selectedIndex = 0) { InitializeComponent(); page = parentpage; this.popup = popup; this.Height = height; this.Width = width; //SignInUpPivot.SelectedIndex = selectedIndex; parentAppBar = parentpage.ApplicationBar; this.Loaded += (s, e) => { page.BackKeyPress += page_BackKeyPress; }; this.Unloaded += (s, e) => { page.ApplicationBar = parentAppBar; page.BackKeyPress -= page_BackKeyPress; }; } void page_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e) { popup.IsOpen = false; e.Cancel = true; }
private void Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e) { int selectedIndex = (sender as Pivot).SelectedIndex; if (selectedIndex == 0) { page.ApplicationBar = (Microsoft.Phone.Shell.ApplicationBar)Resources["SignInAppbar"]; } else if (selectedIndex == 1) { page.ApplicationBar = (Microsoft.Phone.Shell.ApplicationBar)Resources["SignUpAppbar"]; } }問題4:無法使用Code4Fun toolkit里的ToastPrompt來進行提示。網上一搜,c4f的開發者說ToastPrompt是所在層級與popup不一樣(在popup之下,page之上),看了一下源碼它使用了自己實現的popup來實現ToastPrompt。把c4f里的ToastPrompt改造成使用的Popup來實現,效果不好,但總算能顯示在彈出來的東西之上,效果不好。
問題5:注冊頁里的TextBox會被彈出來的鍵盤遮住,不能像page那樣自動向上移動。同樣有人問了這樣的問題:
這個真心沒找到解決方案。
可見Popup來實現缺點太多。
思路三:還是用Page,只有一個問題:如何在登錄成功后執行/通知前一個頁面,執行一些操作,更新UI等?
解決方法:
1在SignInUp頁里加一個可以登錄注冊成功事件,以便前一個頁面添加回調
public partial class SignInUp : PhoneApplicationPage { //回調 public static event EventHandler OnSuccess; public SignInUp() { InitializeComponent(); }2登錄注冊成功后調用OnSuccess
XXXService.Login(username, password, delegate(int loginResult) { switch (loginResult) { case 1: //登錄成功 //Main.ToastMessage = "登錄成功"; App.CurrentAccount = new Account { Username = username, Password = password, }; if (AutoSignInCheckBox.IsChecked == true) { GuanjiaPersistentUserDatas.Account = App.CurrentAccount; } //調用回調 if (OnSuccess != null) { OnSuccess(null, null); } this.NavigationService.GoBack(); //do something here break; case -1: ToastHelper.GetBasicToast("用戶密碼錯誤", "登錄失敗").Show(); break; case -2: ToastHelper.GetBasicToast("用戶不存在", "登錄失敗").Show(); break; default: break; } },
3在父頁面中只需在navigation到SignInUp.xaml前多一個步驟
private void doSignInUp() { SignInUp.OnSuccess += new EventHandler(signInUp_OnSuccess); NavigationService.Navigate(new Uri("/Views/SignInUp.xaml?Action=SignIn", UriKind.Relative)); }
DONE!
本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!