2010-12-11 5 views
1

내 앱에는 여러 페이지가 있습니다. Windows "뒤로"버튼을 클릭하면 모든 것이 예상대로 돌아갑니다.Windows Phone 7 뒤로 버튼 문제

그러나 나는 슬픔의 원인이되는 2 페이지를 가지고 있습니다.

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    // Set the data context of the listbox control to the sample data 
    if (DataContext == null) 
     DataContext = App.ViewModel; 

    App.ViewModel.Refresh(); 
    lbPrograms.ItemsSource = App.ViewModel.Items; 
} 

private void lbPrograms_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    NavigationService.Navigate(new Uri("/DisplayProgram.xaml?selectedItem=" + lbPrograms.SelectedIndex, UriKind.Relative)); 
} 

private void BackBtn_Click(object sender, EventArgs e) 
{ 
    NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 
} 

페이지 B 내가 데이터를 복용하고로 아니오 XAML에서 바인딩이 없습니다 :

<ListBox x:Name="lbPrograms" ItemsSource="{Binding Items}" SelectionChanged="lbPrograms_SelectionChanged"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel x:Name="DataTemplateStackPanel" Orientation="Horizontal"> 
        <Image x:Name="ItemImage" Source="/images/ArrowImg.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
        <StackPanel> 
         <TextBlock x:Name="ItemText" Text="{Binding programName}" Margin="-2,-13,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
         <TextBlock x:Name="DetailsText" Text="{Binding createDate}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/> 
        </StackPanel> 
        <Image x:Name="ItemFavs" Source="/images/favs.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
        <Image x:Name="ItemDelete" Source="/images/delete.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

는 페이지 A에 대한 뒤에 코드는 매우 간단하다 : 페이지 "A"는 일부 XAML에서 바인딩을하고있다 ModelView에서 화면에 동적으로 그려. 그래서 같이 :

private int index; 
protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    string selectedIndex = ""; 
    if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex)) 
    { 
     //prevents error 
     if (int.Parse(selectedIndex) == -1) 
     { 
      return; 
     } 


     if ((DataContext == null)) 
     { 
      index = int.Parse(selectedIndex); 
      App.ViewModel.Refresh(); 
      DataContext = App.ViewModel.Items[index].nValDictionary; 


      int i = 0; 
      foreach (KeyValuePair<string, string> kvp in (((System.Collections.Generic.Dictionary<string, string>)(DataContext)))) 
      { 
       StackPanel sp = new StackPanel(); 
       sp.Name = "sp" + i; 
       sp.Background = new SolidColorBrush(Colors.Black); 
       sp.Width = 460; 

       WrapPanel wp = new WrapPanel(); 
       wp.Name = "test" + i; 
       wp.Width = 300; 
       wp.Height = 200; 


       TextBlock txt = new TextBlock(); 
       txt.Text = kvp.Key.ToString(); 
       txt.Foreground = new SolidColorBrush(Colors.White); 
       sp.Children.Add(txt); 

       int chkBoxesVal = 0; 
       if (kvp.Value == "") 
       { 
        chkBoxesVal = 0; 
       }else{ 
        chkBoxesVal = Convert.ToInt32(kvp.Value.ToString()); 
       } 

       int iCount = 0; 
       for (iCount = 0; iCount <= chkBoxesVal - 1; iCount++) 
       { 
        CheckBox chk = new CheckBox(); 
        chk.Name = i.ToString(); 
        chk.Width = 56; 
        chk.Height = 70; 
        chk.Content = ""; 

        //chk.Background = new SolidColorBrush(Colors.Black); 
        //chk.BorderBrush = new SolidColorBrush(Colors.White); 

        chk.Style = (Style)Application.Current.Resources["checkBoxNG"]; 


        wp.Children.Add(chk); 
       } 

       sp.Children.Add(wp); 

       lbItems.Items.Add(sp); 
       i += 1; 
      } 
     } 
    } 
} 

}

그래서 앞으로있을 때 모든 것이 잘 작동하지만 내가 페이지 B에 "뒤로"버튼을 윈도우를 쳤을 때 나는 오류가 발생합니다. 코드를 밟아서 "뒤로"버튼을 누르면 페이지 A로 되돌아갑니다. 그런 다음 페이지 B로 이동하여 오류를 던지고 멈 춥니 다. 왜 이런 행동이 일어나고 있는지 누군가가 말해 줄 수 있습니까? 나는 그것이 A 페이지로 돌아가서 거기서 멈출 것이라고 기대할 것입니다. 내 코드에 페이지 B를 다시로드하는 원인이 있습니까? 이 동작을 설명 할 수있는 모든 리소스도 환영합니다!

감사합니다!

답변

1

을 추가 할 수 있습니다.

SelectionChanged 이벤트에서 작업을 수행하기 전에 SelectedIndex가 -1인지 확인할 수 있습니다.

또는이 초기화를 수행하는 동안 SelectionChanged에서 기존 이벤트 처리기를 제거하고 완료시 해당 이벤트 처리기를 복원 할 수 있습니다.

+0

그건 기본적으로 내가 무엇을하고 있는지 (theSelectedIndex> 0인지 확인하는 것). 감사! ManipulationStarted 이벤트는 @lukas 덕분에 흥미 롭습니다. 아직 해결 중입니다. – webdad3

1

제 생각에 lbPrograms_SelectionChanged 이벤트는 뒤로 단추를 누르고 페이지 A를 다시로드 할 때 발생합니다.

탐색 디자인을 변경하십시오. 당신의 DataTemplateStackPanel 위해 당신은 ManipulationStarted 이벤트 를 사용하고 내부는 OnNavigatedTo에서하고있는 ItemsSource 초기화의 결과로 발사되는 페이지 A에서 인 selectionchanged처럼 보이는

NavigationService.Navigate(new Uri("/DisplayProgram.xaml?selectedItem=" + lbPrograms.SelectedIndex, UriKind.Relative)); 
+0

selectedChanged 이벤트가 뒤로 가기 버튼에서 실행되는 것이 맞았습니다. 어떤 이유로 인해 ManipulationStarted 이벤트에있을 때 lbPrograms.SelectedIndex 값이 채워지지 않았습니다. 이 동작을 조금보고 난 후에 ManipuationStarted를 꺼내서 SelectedIndex == -1인지 확인했습니다. 그렇지 않다면 나는 그것이 일상의 나머지 부분을 통과하도록 허용했다. 그렇지 않으면 나는 그것을 반환으로 막았습니다. 내 문제가 해결 된 것 같습니다. selectedIndex 값을 얻는 방법에 대한 제안 사항이 있으면 알려주십시오. – webdad3