Почему, когда я переключаю свой семантический зум, он не переходит в раздел?
Что-то странное с моим семантическим увеличением. У меня есть два раздела:
И когда я установил ZoomOut, группировка в порядке, вот изображение:
Но, например, если я выберу второй вариант, семантическое масштабирование не приведет меня к нажатому элементу.
Вот самые важные части моей программы.
<!-- from resources -->
<CollectionViewSource
x:Name="groupedItemsViewSource"
Source="{Binding Groups}"
IsSourceGrouped="False">
...
<!-- Horizontal scrolling grid used in most view states -->
<SemanticZoom x:Name="semanticZoomControl" Grid.Row="1" >
<SemanticZoom.ZoomedInView>
<ListView x:Name="itemGridView" SelectionMode="None" IsItemClickEnabled="False"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollMode="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollMode="Auto"
Margin="0,-3,0,0"
Padding="116,0,40,46"
ItemTemplateSelector="{StaticResource StartItemSelector}"
ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
ItemContainerStyle="{StaticResource ListViewItemStyleFlat}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
</SemanticZoom.ZoomedInView>
<SemanticZoom.ZoomedOutView>
<ListView x:Name="groupGridView" CanDragItems="False"
CanReorderItems="False" SelectionMode="None" IsItemClickEnabled="True"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollMode="Auto"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollMode="Disabled"
ItemContainerStyle="{StaticResource ListViewItemStyleSimple}"
ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
ItemTemplateSelector="{StaticResource ZoomedOutSelector}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Height="330"
HorizontalAlignment="Left" VerticalAlignment="Top" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
В чем может быть причина, по которой это происходит?
Если вы чувствуете себя более комфортно, вы можете скачать проект с SkyDrive: http://sdrv.ms/Ma0LmE
2 ответа
Вам нужно установить ItemsSource для уменьшенного GridView в коде позади, как
groupGridView.ItemsSource = groupedItemsViewSource.View.CollectionGroups;
Скорее всего, вам потребуется обновить шаблоны для этой таблицы, чтобы добавить "группу". до твоих привязок.
Ваш ItemTemplateSelector также перестанет работать, при этом ему будет передан DependencyObject, а не ваша связанная группа. Вы можете преобразовать объект в ICollectionViewGroup, у которого есть свойство Group, которое вы можете преобразовать в объект вашей модели и т. Д.
Это все боль в заднице, но я не могу найти лучшего способа в данный момент.
Мой случай несколько отличался, но я решил поделиться им здесь, надеюсь, кто-то найдет его полезным. В моем приложении у меня было два разных источника данных для увеличения / уменьшения представлений семантического зума. Это, конечно, нарушило связь между ними, поэтому я не мог сделать то, что @Nigel предложил выше, и что будет работать в общем случае. Вместо этого мне пришлось справиться с прокруткой самостоятельно.
Итак, я добавил обработчик событий для события изменения вида:
<SemanticZoom ViewChangeStarted="OnSemanticZoomViewChangeStarted">
...
</SemanticZoom>
Затем я определил это в коде:
private void OnSemanticZoomViewChangeStarted(object sender, SemanticZoomViewChangedEventArgs e)
{
// only interested in zoomed out->zoomed in transitions
if (e.IsSourceZoomedInView)
{
return;
}
// get the selected group
MyItemGroup selectedGroup = e.SourceItem.Item as MyItemGroup;
// identify the selected group in the zoomed in data source (here I do it by its name, YMMV)
ObservableCollection<MyItemGroup> myItemGroups = this.DefaultViewModel["GroupedItems"] as ObservableCollection<MyItemGroup>;
MyItemGroup myGroup = myItemGroups.First<MyItemGroup>((g) => { return g.Name == selectedGroup.Name; });
// workaround: need to reset the scroll position first, otherwise ScrollIntoView won't work
SemanticZoomLocation zoomloc = new SemanticZoomLocation();
zoomloc.Bounds = new Windows.Foundation.Rect(0, 0, 1, 1);
zoomloc.Item = myItemGroups[0];
zoomedInGridView.MakeVisible(zoomloc);
// now we can scroll to the selected group in the zoomed in view
zoomedInGridView.ScrollIntoView(myGroup, ScrollIntoViewAlignment.Leading);
}
Как видите, хак в том, что сначала нужно перемотать сетку для ScrollIntoView
работать правильно. Я полагаю, что это всего лишь еще одно из "конструктивных" решений Microsoft...:P