우리는 도구 상자 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;
}
}
감사합니다. @Pantelis. 에디터가 ListPicker의 FullScreen으로 돌아가서 ListPicker를 호스팅하는 페이지로 되돌아 가지 않고 다른 항목을 편집/볼 수있는 기회를 사용자에게 제공하는 것이 좋습니다. 제안 된 UX는 어색 할 수 있습니다. –
내 대답을 수정했습니다. – Pantelis
ListPickerPage.xaml, @Pantelis에 대한 분석에 감사드립니다. ListPickerPage.xaml이 DataContext를 다시 설정하도록 상태를 유지하지 않는 이유는 무엇입니까? 버그 같은데. 부끄러운 일입니다. –