'Navigation'에 해당되는 글 2건

  1. 2017.07.17 [WPF] NavagionManager
  2. 2012.02.16 [wp7] MessageBox를 띄운 상태에서 Tombstone
wpf2017. 7. 17. 16:58

Grid 같은 패널에 Add,Clear 하면서 임시로 nagiation처럼 되도록 하는 방법이 있지만


Frame을 이용하면 더 깔끔하게 가능하다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static class NavigationManager
    {
        private static Frame _mainContentFrame;
 
        public static void SetFrame(Frame frame)
        {
            _mainContentFrame = frame;
        }
 
        public static void Navigate(UserControl page)
        {
            _mainContentFrame.Navigate(page);
        }
    }


Xaml


1
2
3
<Grid x:Name="xMainWindowPanel">
        <Frame x:Name="xMainFrame" NavigationUIVisibility="Hidden" />
</Grid>


사용법


1
2
3
4
5
  private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            NavigationManager.SetFrame(xMainFrame);
            xMainFrame.Navigate(new LoginPage());
        }

추가...

naviagte를 하게 되면 이전 페이지가 필요 있으면 메모리에 남게 되므로 메모리 관리에 문제가 있을수 있다.

 public static void Navigate(UserControl page)
        {
            _mainContentFrame.Navigate(page);

            while (_mainContentFrame.CanGoBack == true)
            {
                _mainContentFrame.RemoveBackEntry();
            }
        }

RemoveBackEntry()로 지워주자


Posted by 동동(이재동)
Windows Phone 72012. 2. 16. 17:12

코레일 만드는도중 앱이 꺼졌다 이유를 보니

MessageBox가 띄워져 있는 상태에서  ok를 누르면 프로세서를 타고

cancel을 누르면 navivation.goback()을 하게 되어 잇는데

메세지 박스가 띄워져 있는 상태에서 tombtone을 하게 되면

cancel 된 분기문으로 가게 되어 있는데

거기에서 navigation.goback()부분에서 에러가 나는거였다.

그래서 혹시 goback()을 하기전에 이걸 체크하는게 있나 싶었는데 없었다. cangoback이거는 딴조건인듯

해결법은

bool _isTombstone; //톰스톤인지 아닌지 구분

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
      {
          base.OnNavigatedFrom(e);
          _isTombstone = true;
      }
 

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
      {
          base.OnNavigatedTo(e);
          _isTombstone = false;

       }

if (MessageBox.Show(msg, string.Empty, MessageBoxButton.OKCancel) == MessageBoxResult.OK)
                    {
                        XmlGroupManager xgmInside = new XmlGroupManager();
                        xgmInside.GetData(um.GetReserveCancelUrl(StaticManager.JrnyInfoModelSelectedItem));
                        xgmInside.xdmCE.CompleteGroupDataEvent += new EventHandler<Events.XmlGroupDataEventArgs>(xdmCE_CompleteGroupDataEvent);
                        xgmInside.xdmCE.errorEvent += new EventHandler<Events.XmlDataEventArgs>(xdmCE_errorEvent);
                    }
                    else
                    {
                        if (_isTombstone == false)
                        {
                            (Application.Current.RootVisual as PhoneApplicationFrame).GoBack();
                        }
                    }

 

이런식으로 해결했다. NavigatedFrom할때 이것이 톰스톤인지 아닌지를 구분해서 goback을 할지 안할지를 구분했다

 

그리고 만약 저런식이 아닌

 

if (e.Error != null)
            {
                (Application.Current.RootVisual as PhoneApplicationFrame).GoBack();
                MessageBox.Show("네트워크를 확인해 주세요.");
                return;
            }

메세지 박스를 띄운후 goback은 절대 하지 말고

먼저 뒤로 가고 메세지 박스를 띄우는게 낫다.

Posted by 동동(이재동)