2014-04-29 1 views
3

제 질문은 주어진 페이지 즉, 처음으로 뒤로 버튼 닫기를 클릭하고 페이지에서 팝업을 닫고 두 번째로 탐색하는 방법을 정의하는 것입니다.뒤로 버튼에 대한 페이지 기반 작업

WP8.1 NavigationHelper 매우 유용하지만 그것은 단지 키 (페이지를 종료)를 다시 클릭에 대해 하나 개의 일반적인 동작을 제공하기 때문에.

그것의 명령과 뒤로 버튼 클릭에 대한 핸들러 비공개에 대한 더 setter를 제공하지 않기 때문에 내가 NavigationHelper을 덮어 쓸 수 없습니다, 그래서 페이지를 입력에 고정을 해제 할 수 없다. NavigationHelper를 변경하면 W8.1 & WP8.1 용 범용 앱을 개발하고 있으며 뒤로 버튼에 대한 사용자 정의 처리기가 필요한 여러 페이지가 있기 때문에 추한 것 같습니다.

--edit--

명령 덮어 쓰기를 허용, 아직 나는 각 페이지에 원래의 명령을 사용합니다. 해결책은 각 페이지에 새로운 명령을 작성하는 것입니다.

답변

4

NavigationHelper가 수행하기 전에 Windows.Phone.UI.Input.HardwareButtons.BackPressed에 가입 할 수 있습니다 (Page.Loaded 이벤트에 가입했는지 확인 했으므로). 이 목적을 위해 사실 (나중에 EventHandlers을 추가 할 예정으로) 당신은 당신의 EventHandlers를 호출합니다 특별한 InvokingMethod해야합니다 BackPressed이 NavigationHelper의 이벤트 핸들러 전에 해고 될 것이다이 경우

// in App.xaml.cs make a method and a listOfHandlers: 
private List<EventHandler<BackPressedEventArgs>> listOfHandlers = new List<EventHandler<BackPressedEventArgs>>(); 

private void InvokingMethod(object sender, BackPressedEventArgs e) 
{ 
    for (int i = 0; i < listOfHandlers.Count; i++) 
     listOfHandlers[i](sender, e); 
} 

public event EventHandler<BackPressedEventArgs> myBackKeyEvent 
{ 
    add { listOfHandlers.Add(value); } 
    remove { listOfHandlers.Remove(value); } 
} 

// look that as it is a collection you can make a variety of things with it 
// for example provide a method that will put your new event on top of it 
// it will beinvoked as first 
public void AddToTop(EventHandler<BackPressedEventArgs> eventToAdd) { listOfHandlers.Insert(0, eventToAdd); } 

// in App constructor: - do this as FIRST eventhandler subscribed! 
HardwareButtons.BackPressed += InvokingMethod; 

// subscription: 
(App.Current as App).myBackKeyEvent += MyClosingPopupHandler; 
// or 
(App.Current as App).AddToTop(MyClosingPopupHandler); // it should be fired first 

// also you will need to change in NavigationHelper.cs behaviour of HardwereButtons_BackPressed 
// so that it won't fire while e.Handeled == true 
private void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e) 
{ 
    if (!e.Handled) 
    { 
     // rest of the code 
    } 
} 

을 당신은 당신을 e.Handeled = true;을 설정하는 경우 같은 페이지에 있어야합니다. 대신 App.xaml.cs를 당신이 이런 식으로 당신의 페이지 클래스 또는 NavigationHelper을 확장 할 수 있습니다 수정도

주, 당신의 요구에 따라 달라집니다.

1

이벤트가 추가되는 순서에 따라 꽤 추합니다. NavigationHelper를 사용하면 작업을 우회하는 것보다 훨씬 깨끗합니다.

당신은 NavigationHelper의 GoBackCommand 및 GoForewardCommand 속성에 자신의 RelayCommand를 설정할 수 있습니다. 또 다른 옵션은 NavigationHelper를 서브 클래스 화하고 CanGoBack 및 GoBack 함수를 오버라이드하는 것입니다 (가상입니다). 당신이 당신의 사용자 지정 논리로 NavigationHelper의 기본 동작을 대체 할 수

어느 쪽이든은 중간 상태를 닫거나 적절한 Frame.GoBack를 호출합니다.

+1

+1 오른쪽 깔끔한 해결 - [참고 예에 응답하도록 (http://stackoverflow.com/a/27008026/2681948) – Romasz

관련 문제