2014-06-22 6 views
2

우리는 도구 상자 ListPicker 컨트롤을 사용하여 ObservableCollection을 표시합니다. 이제는 사용자가 선택적으로 ListPicker를 탐색하여 ObservableCollection의 개체에 대한 편집기로 이동할 수있게하려고합니다.Windows Phone 8 ListPicker는 ContextMenu를 사용하여 탐색하면서 멀리 페이지가 완전히 비어 있습니다.

사용자가 편집기로 이동할 수 있도록 ItemTemplate에 ContextMenu를 추가했습니다. 사용자는 항목을 길게 탭한 후 컨텍스트 메뉴를 표시합니다. 사용자가 메뉴 항목을 탭하면 편집기 페이지가 나타납니다. 사용자가 편집기에서 뒤로 버튼을 누르면 완전히 빈 페이지로 돌아가고 시스템 트레이 만 표시됩니다. 사용자가 다시 버튼을 누르면 ListPicker 인스턴스가있는 페이지로 대체되기 전에 ListPicker가 잠깐 나타납니다.

빈 페이지의 요점은 무엇이며이를 없애는 방법이 있습니까?


다음은 ListPicker 인스턴스의 XAML입니다. 여기

<toolkit:ListPicker 
    x:Name="listPicker_Generators" 
    Margin="12,-6,0,12" 
    ExpansionMode="FullScreenOnly" 
    HorizontalAlignment="Left" 
    Width="430" 
    Height="Auto" 
    VerticalAlignment="Top" 
    FullModeHeader="{Binding Source={StaticResource LocalizedStrings}, Path=LocalizedResources.label_AccountEditor_Generator}" 
    > 
    <toolkit:ListPicker.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" /> 
     </DataTemplate> 
    </toolkit:ListPicker.ItemTemplate> 
    <toolkit:ListPicker.FullModeItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical"> 
       <TextBlock Text="{Binding Name}" FontSize="36" /> 
       <TextBlock Text="{Binding Notes}" Margin="0,0,0,12" FontFamily="Segoe WP" FontSize="{StaticResource PhoneFontSizeSmall}" /> 
       <toolkit:ContextMenuService.ContextMenu> 
        <toolkit:ContextMenu 
         Visibility="{Binding Visibility}" 
         Closed="ContextMenu_Closed" 
         Opened="ContextMenu_Opened"> 
         <toolkit:MenuItem 
          Name="menuItem_Edit" 
          Header="{Binding Source={StaticResource LocalizedStrings}, Path=LocalizedResources.label_AccountEditor_EditGenerator}" 
          Click="menuItem_Edit_Click" /> 
        </toolkit:ContextMenu> 
       </toolkit:ContextMenuService.ContextMenu> 
      </StackPanel> 
     </DataTemplate> 
    </toolkit:ListPicker.FullModeItemTemplate> 
</toolkit:ListPicker> 

상황에 맞는 메뉴 처리를위한 뒤에있는 코드입니다.

private void menuItem_Edit_Click(object sender, RoutedEventArgs e) 
    { 
     AccountViewModel.GeneratorChoice item = ((AccountViewModel.GeneratorChoice)((sender as FrameworkElement).DataContext)); 

     if (item != null) 
     { 
      AccountViewModel vm = DataContext as AccountViewModel; 
      vm.HoldingSelectedGeneratorIndex = listPicker_Generators.SelectedIndex; 

      NavigationService.Navigate(new Uri("/Views/GeneratorEditor.xaml?id=" + item.Id.ToString(), UriKind.Relative)); 

      // force the selection to change so we get redrawn when we come back 
      if (listPicker_Generators.SelectedIndex > 0) 
       listPicker_Generators.SelectedIndex--; 
      else 
       listPicker_Generators.SelectedIndex++; 
     } 
    } 

    private void ContextMenu_Closed(object sender, RoutedEventArgs e) 
    { 
     AccountViewModel vm = DataContext as AccountViewModel; 
     vm.ContextMenuOpen = false; 
    } 

    private void ContextMenu_Opened(object sender, RoutedEventArgs e) 
    { 
     // a work-around from http://stackoverflow.com/questions/15181441/windows-phone-toolkit-context-menu-items-have-wrong-object-bound-to-them-when-an 
     ContextMenu contextMenu = (sender as ContextMenu); 

     FrameworkElement owner = (contextMenu.Owner as FrameworkElement); 
     if (owner.DataContext != contextMenu.DataContext) 
      contextMenu.DataContext = owner.DataContext; 

     AccountViewModel.GeneratorChoice item = contextMenu.DataContext as AccountViewModel.GeneratorChoice; 

     if (item.Id.Value != 0) 
     { 
      bool factorySupplied = item.FactorySupplied == null ? false : true; 

      if (factorySupplied) 
      { 
       contextMenu.Items.OfType<MenuItem>().First(m => (string)m.Name == "menuItem_Edit").Header = AppResources.label_AccountEditor_ViewGenerator; 
      } 

      AccountViewModel vm = DataContext as AccountViewModel; 
      vm.ContextMenuOpen = true; 
     } 
    } 

답변

0

다시 listpicker의 전체 화면을 탐색 단지 세부 정보 페이지에 다시 키 입력을 무시하고 listpicker를 호스팅하는 페이지로 다시 탐색 할 필요가 없습니다합니다.

세부 사항 페이지 :

protected override void OnBackKeyPress(CancelEventArgs e) 
{ 
    base.OnBackKeyPress(e); 
    e.Cancel = true; 
    NavigationService.Navigate(
     new Uri("ListPickerView.xaml", UriKind.Relative)); 
} 

}

편집

나는 그게 listpicker를 사용하여 불가능을 두려워 해요. 이 경우 listpicker 전체 화면 모드를 시뮬레이트하는 별도의 페이지를 작성해야합니다. 툴킷에서 컨트롤을 검사하면 내부적으로 ListPickerPage.xaml 페이지로 이동한다는 것을 알 수 있습니다. 해당 페이지에 대한 상태 보존 및 DataContext 할당은 컨트롤에 의해 수행됩니다.

세부 정보 페이지에서 하드웨어 뒤로 단추를 누르면 탐색 기록 스택 맨 위에있는 페이지, 즉 ListPickerPage.xaml이 프레임에서 팝됩니다. 그 순간, 페이지에 전달 된 DataContext가 없기 때문에 빈 페이지가 표시됩니다.

+0

감사합니다. @Pantelis. 에디터가 ListPicker의 FullScreen으로 돌아가서 ListPicker를 호스팅하는 페이지로 되돌아 가지 않고 다른 항목을 편집/볼 수있는 기회를 사용자에게 제공하는 것이 좋습니다. 제안 된 UX는 어색 할 수 있습니다. –

+0

내 대답을 수정했습니다. – Pantelis

+0

ListPickerPage.xaml, @Pantelis에 대한 분석에 감사드립니다. ListPickerPage.xaml이 DataContext를 다시 설정하도록 상태를 유지하지 않는 이유는 무엇입니까? 버그 같은데. 부끄러운 일입니다. –