2014-11-18 1 views
3

WP 8.1 XAML 응용 프로그램을 개발 중입니다. 첫 번째 페이지는 로그인 페이지이고 두 번째 페이지는 예를 들어 기록 페이지입니다. 더 많은 페이지가 있지만 지금은 중요하지 않습니다. 로그인 페이지에서 로그인 버튼을 누르면 두 번째 (기록) 페이지가 나타납니다. 내역 페이지에서 (실제) 뒤로 버튼을 누르면 로그인 페이지로 돌아갑니다. 하지만이 기능을 비활성화하고 싶습니다. 대신이 버튼을 누르면 MessageDialog가 나타나고 몇 초 안에 (예 : 3 초) 다시 누르면 앱이 종료됩니다. 내 질문에 대한 답변을 찾으려고했지만 제대로 작동하지 않습니다. 로그인 페이지에서 다음과 같이 시도했습니다.Windows Phone 8.1 특정 페이지의 뒤로 단추 다시 지정

내 앱은 두 번째 (기록) 페이지에서 뒤로 버튼을 누르면 종료됩니다. 그러나 내가 뒤로 버튼을 눌러 계산하려고하면 다시 로그인 페이지로 이동합니다. 이 후 다시 로그인하고 뒤로 버튼을 누르면 카운터가 2가되고 앱이 종료됩니다. 나는 2 MessageDialog 라인의 주석을 해제하면 메시지가 나타납니다

private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) 
{ 
    //MessageDialog msgbox = new MessageDialog("This is a popup message"); 
    //await msgbox.ShowAsync(); 
    //e.Handled = true; 
    backPressCount++; 

    if (backPressCount==2 && Frame.CurrentSourcePageType.FullName == "MyAppName.History") 
     Application.Current.Exit(); 
} 

,하지만 난 다시 로그인 페이지로 탐색 할 것 : 여기 내가 뭘하려 코드입니다. 그리고 e.Handled = true; 줄 주석 처리를 시도했지만 도움이되지 않았습니다. 기록 페이지의 뒤로 버튼을 비활성화하거나 완전히 무시해야한다고 생각합니다. 아무도 내 문제에 대한 아이디어가 있습니까?

편집 : 두 번 누르기 사이의 시간을 측정하기 위해 티커를 사용하고 싶지 않기 때문에 다시 버튼 행동을 다시 생각해보십시오. 이 질문 대신 팝업 메시지를 원합니다. 예를 들어 "정말로 끝내시겠습니까?" 2 개의 버튼 (예 및 아니오)이 있습니다. 다음 코드와 함께 작동합니다 :

private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) 
{ 
    e.Handled = true; 
    MessageDialog dlg = new MessageDialog("Are you sure you want to quit you will loose all your work ?", "Warning"); 
    dlg.Commands.Add(new UICommand("Yes", new UICommandInvokedHandler(CommandHandler1))); 
    dlg.Commands.Add(new UICommand("No", new UICommandInvokedHandler(CommandHandler1))); 

    await dlg.ShowAsync(); 
} 

private void CommandHandler1(IUICommand command) 
{ 
    var label = command.Label; 
    switch (label) 
    { 
     case "Yes": 
     { 
       Application.Current.Exit(); 
       break; 
      } 
     case "No": 
     { 
       break; 
     } 
    } 
} 

팝업에서 답변을 선택하기 전에 문제가 생깁니다. 로그인 페이지로 이동합니다. 예를 누르면 앱이 종료되고 아니요를 선택하면 아무 것도하지 않습니다. 그러나 지금은 로그인 페이지에 있습니다. dlg.ShowAsync() 대신 dlg.Show()를 사용하려고 시도했지만 누락되었습니다. 따라서 비동기 메서드 만 사용할 수 있습니다.이 경우에는 뒤로 단추를 누를 때 NavigationHelper가 항상 호출되므로 페이지가 백그라운드에서 로그인하도록 탐색합니다. 무엇이 문제입니까?

+1

이동합니다. 당신은 e.Helleled를 설정하기 전에 더 많은 것들이 처리되기를 기다리고 있습니다. 뒤로 버튼을 구독 한 순서를 확인할 수도 있습니다. – Romasz

+0

[이 답변] (http://stackoverflow.com/a/23356169/2681948)을 참조 할 수도 있습니다. – Romasz

+0

제 질문에 몇 가지 정보를 추가했습니다. 불행히도 헛되이 e.Handled 전에 MessageDialog. – Speederer

답변

9

이것이 정말로하고 싶은 일이라면 열심히 노력하십시오. 보다 사용자 친화적 인 흐름은 데이터를 저장하고 사용자가 앱에서 나와 다시 돌아 가게하는 것입니다. 또한 사용자가 창이나 카메라 버튼과 같은 다른 방법으로 종료하면 어떻게 될지 고려하십시오.

즉, 사용자가 가지고있는 네비게이션 처리 (빈 페이지 템플릿에서 시도)가 유일한 경우 해당 코드가 작동합니다. 나는 이것이 유일한 것이 아니라고 생각하며, BasicPage와 같은 더 완벽한 템플릿에서 NavigationHelper와 같은 것을 사용하고 있습니다. 이 경우 NavigationHelper의 GoBackCommand가 아마도 Frame.GoBack을 트리거하고 호출합니다.

당신은 NavigationHelper의 GoBackCommand 속성에 자신의 RelayCommand를 설정하여이 동작을 재정의 할 수 있습니다 MessageDialog 전에 e.Handeled

RelayCommand _checkedGoBackCommand; 
public BasicPage1() 
{ 
    this.InitializeComponent(); 

    this.navigationHelper = new NavigationHelper(this); 
    this.navigationHelper.LoadState += this.NavigationHelper_LoadState; 
    this.navigationHelper.SaveState += this.NavigationHelper_SaveState; 

    _checkedGoBackCommand = new RelayCommand(
            () => this.CheckGoBack(), 
            () => this.CanCheckGoBack() 
           ); 

    navigationHelper.GoBackCommand = _checkedGoBackCommand; 
} 

private bool CanCheckGoBack() 
{ 
    return true; 
} 

private async void CheckGoBack() 
{ 
    Debug.WriteLine("CheckGoBack"); 
    MessageDialog dlg = new MessageDialog("Are you sure you want to quit you will loose all your work ?", "Warning"); 
    dlg.Commands.Add(new UICommand("Yes", new UICommandInvokedHandler(CommandHandler1))); 
    dlg.Commands.Add(new UICommand("No", new UICommandInvokedHandler(CommandHandler1))); 

    await dlg.ShowAsync(); 
} 

private void CommandHandler1(IUICommand command) 
{ 
    var label = command.Label; 
    switch (label) 
    { 
     case "Yes": 
      { 
       Application.Current.Exit(); 
       break; 
      } 
     case "No": 
      { 
       break; 
      } 
    } 
} 
+0

대단히 감사합니다! 그것은 작동합니다! :) – Speederer