Почему, когда я переключаю свой семантический зум, он не переходит в раздел?

Что-то странное с моим семантическим увеличением. У меня есть два раздела:

И когда я установил 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

Другие вопросы по тегам