Как устранить задержку в SelectedIndex для GridViewItem С# (UWP)

Первый пост Ура! - У меня есть gridview, который предоставляет пользователю 4 варианта. При выборе элемента 0 открывается скрытое подменю, относящееся к этому параметру, в то время как другие элементы имеют другую функциональность. Чтобы выбрать правильный индекс, я должен сделать выбор дважды. SelectedIndex начинается с -1, что, согласно документации, является предполагаемым поведением и имеет смысл. Если я инициализирую представление с индексом 0, границы элемента будут выделены, как если бы он был выбран, и для активации меню требуется всего один щелчок, но если я щелкну любой другой элемент, для регистрации этих элементов потребуется два щелчка.

Например, если у меня выбран индекс 0, затем выберите индекс 1, он показывает индекс 0, а если я снова выбираю индекс 0, он показывает индекс 1.

        private void GridView_ItemClick(object sender, ItemClickEventArgs e)
    {
        
        int index = StudyTypeGrid.SelectedIndex;
        var selected = e.ClickedItem;
        System.Diagnostics.Debug.WriteLine("Index: " + index);
        System.Diagnostics.Debug.WriteLine("Item: " + selected.ToString());

        if (selected != null && index == 0)
        {
            HiddenOptionPanel.Visibility = Visibility.Visible;
        }else
        {
            HiddenOptionPanel.Visibility = Visibility.Collapsed;
        }
    }

Вот кусок Xaml:

                        <GridView x:Name="StudyTypeGrid"  HorizontalAlignment="Center" Margin="0,20,0,0" ItemClick="GridView_ItemClick"
                              IsItemClickEnabled="True" IsDoubleTapEnabled="False">
                        <GridViewItem Height="200" Width="200" >
                            <StackPanel Width="200">
                                <StackPanel Height="100">
                                    <TextBlock Text="Option 1" FontSize="24" TextWrapping="WrapWholeWords"
                                               HorizontalAlignment="Center"  TextAlignment="Center" Margin="0,20,0,0" />
                                </StackPanel>
                                <StackPanel Background="LightGray" Height="100">
                                    <TextBlock Text="Description"
                                               TextWrapping="WrapWholeWords" TextAlignment="Center" VerticalAlignment="Center" />
                                </StackPanel>
                            </StackPanel>
                        </GridViewItem>

Я также попытался установить для IsDoubleTapEnabled значение false и попытался сослаться на выбранный объект вместо выбранного индекса. Исходный оператор If имел только индекс == 0, но оставил выбранным, чтобы показать, что я тоже пробовал этот маршрут. Идя слева направо и обратно, я получаю следующий вывод:

Индекс: -1
Элемент: Windows.UI.Xaml.Controls.StackPanel
Индекс: 0
Элемент: Windows.UI.Xaml.Controls.StackPanel
Индекс: 1
/> Элемент: Windows.UI.Xaml.Controls.StackPanel
Индекс: 2
Элемент: Windows.UI.Xaml.Controls.StackPanel
Индекс: 3
Элемент: Windows. UI.Xaml.Controls.StackPanel
Индекс: 2
Элемент: Windows.UI.Xaml.Controls.StackPanel
Индекс: 1
Элемент: Windows.UI.Xaml.Controls. Панель стека

Это представление запускается со страницы, которая также имеет представление сетки и отвечает таким же образом. Что мне не хватает?


person Kasey Chakos    schedule 20.07.2020    source источник


Ответы (1)


Когда событие ItemClick запускается, текущий выбранный элемент не изменился, поэтому значение его SelectedIndex по-прежнему является предыдущим выбранным индексом, это ожидаемое поведение. Если вы хотите отображать правильный SelectedIndex, вы можете подписаться на SelectionChanged. В этом случае SelectedIndex является текущим выбранным индексом.

private void StudyTypeGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    int index = StudyTypeGrid.SelectedIndex;
    var selected = e.AddedItems[0];
    System.Diagnostics.Debug.WriteLine("Index: " + index);
    System.Diagnostics.Debug.WriteLine("Item: " + selected.ToString());

    if (selected != null && index == 0)
    {
        HiddenOptionPanel.Visibility = Visibility.Visible;
    }
    else
    {
        HiddenOptionPanel.Visibility = Visibility.Collapsed;
    }
}
person Faywang - MSFT    schedule 21.07.2020
comment
Большое Вам спасибо!! - person Kasey Chakos; 21.07.2020