본문 바로가기

개발

[WPF] Page에 대해 더 살펴보기

Page 이동을 했다는 것을 해당 Page에서는 어떻게 판단할까?

그냥 코딩해본 거라 이게 정석인지는 모르겠으나 일단 해봤다.

 

이전 글의 코드에서 OrderPage.cs에 아래와 같이 처리해보자

2020/10/04 - [개발] - [WPF] 화면 전환 - Frame과 Page

 

[WPF] 화면 전환 - Frame과 Page

이번 글에서는 Kiosk개발 시 화면 전환 하는 방법에 대해 살펴보자. UserControl을 사용해서 하는 방법도 있으나, 여기서는 Page를 활용해본다. 프로젝트를 생성하고 나오는 기본 MainWindows.xaml에 아래��

chriskim10.tistory.com

주의점. Page가 로드된 시점에 이벤트를 등록해야 한다. 생성자에서 하면 NavigationService가 null이다.
그렇다고 MainWindows에 선언된 Frame객체를 찾아내서 하고 싶진 않다. 아래처럼 이벤트 등록해서 처리해보자.

 

        public OrderPage()
        {
            InitializeComponent();
            this.Loaded += OrderPage_Loaded;
        }

        private void OrderPage_Loaded(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigated += NavigationService_Navigated;
        }

        private void NavigationService_Navigated(object sender, NavigationEventArgs e)
        {
            Frame frame = sender as Frame;
            if(frame.CurrentSource == null) //앞으로 이동할 때도 이벤트가 발생하는데 이 상황은 이 값으로 체크
            {
                //do nothing
                Debug.WriteLine("주문페이지 자꾸들어와");
            }
            else
            {
                Debug.WriteLine(frame.CurrentSource);
                //어디선가 back해서 들어왔다는 거임. 처리하고 싶은거 있음 하자
            }
        }

 

 

주문페이지(OrderPage.xaml)에서 식사 장소 선택(PlacePage.xaml)으로 이동해도 NavigationService_Navigated() 이벤트가 발생한다. 다음 페이지로 이동할 때 딱히 처리할 게 없는데, NavigationService의 CurrentSource가 null인 것으로 현재 다음으로 이동하는 동작으로 이벤트가 발생된 것을 알 수 있다. 

이전 페이지에서 되돌아온것이라면 NavigationService의 CurrentSource에 어디서 호출된 건지 알 수 있다 

라고.... 쓰고 있는데 느낌이 쎄하네.

 

사실 난 이러한 UI를 Page로 처리해본 적이 없다. UserControl을 Stack을 사용해서 직접 컨트롤해서 보통 사용했고.

(또한, Frame/Page방식은 이전에 메모리 비효율적인 부분이 있는 것으로 알고 있으나 사실 확인 필요)

수십 번 페이지 이동을 해보니 이 상태로는 없네.

 

 

 

로그를 넣어서 보니 아래와 같은 현상이 있다. 눈으로는 정상 동작인데 흐름을 보니 뭔가 누적이 된다

라고... 쓰고 있는데 아차차.

새로 생성해서 들어올 때도 Loaded가 호출되지만 back을 해도 Loaded가 호출되기 때문에 Navigated 이벤트가 계속 추가 등록돼서 그만큼 누적되어 호출된다. 으이그...

내 잘못이다. 용서해줘

 

안 되겠다. 밥 먹고 다시 돌아온다.

 

 

미션 클리어. 

위에 내용은 일단 레드썬~

 

 

Navigated 이벤트를 등록해서 처리하지 않고, Loaded로도 처리 가능하겠다.

물론 위 부분을 조금 수정하면 되긴 하지만 최대한 간단하게 가보자. 중요한 건 WPF를 잘하는 것은 아니니.

 

public partial class OrderPage : Page
    {
        public OrderPage()
        {
            InitializeComponent();
            this.Loaded += OrderPage_Loaded;
        }

        private void OrderPage_Loaded(object sender, RoutedEventArgs e)
        {
            //여기에 데이터를 비교해서 처리하는 루틴을 추가하면 된다.
        }

        private void btnPrev_Click(object sender, RoutedEventArgs e)
        {
            if(NavigationService.CanGoBack)
            {
                NavigationService.GoBack();
            }
        }

        private void btnNext_Click(object sender, RoutedEventArgs e)
        {
            if (NavigationService.CanGoForward)
            {
                NavigationService.GoForward();
            }
            else
            {
                PlacePage placePage = new PlacePage();
                NavigationService.Navigate(placePage);
            }
        }
    }

 

현재 주문 중인 정보는 어딘가에 저장이 되어 있을 거다. 싱글턴(singleton) 패턴으로 처리되었겠지. 이 프로그램에서 유일한 하나의 객체. 그 값을 활용해서 화면을 refresh 하면 된다.

 

이번 글은 참 엉망이다. 그러나 우리에게는 오프라인 수업이 있다.