Управление фокусом в DataTemplate GridView

У меня есть GridView, который использует DataTemplate для предоставления пользовательского интерфейса, чтобы пользователи могли управлять подписками на службу данных. DataTemplate содержит текст и изображение, а также Button и ToggleButton. Используя это на мобильных устройствах и настольных компьютерах, пользователь может нажимать или нажимать кнопки внутри элемента управления. На рабочем столе вы даже можете использовать Tab внутри элемента управления и выбирать кнопки. Однако на Xbox я могу сосредоточиться только на каждом элементе DataTemplate, я не могу заставить его сосредоточиться на кнопках внутри, есть ли способ обойти это без включения режима мыши на Xbox?

<DataTemplate x:Key="DataTemplate1">
        <Grid Background="#33FFFFFF">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Image HorizontalAlignment="Center" Height="100" VerticalAlignment="Center" Width="80" Source="{Binding TEAMID, Converter={StaticResource uriConverter}}" Grid.RowSpan="3"/>
            <TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" Text="{Binding TEAMNAME}" VerticalAlignment="Top" Grid.Column="1"/>
            <Button Content="Unsubscribe" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1" Grid.Column="1" Tag="{Binding TEAMID}" Tapped="Button_Tapped"/>
            <ToggleButton x:Name="subscribe_tb" Content="&#xE840;" HorizontalAlignment="Center" FontFamily="Segoe MDL2 Assets" Tag="{Binding TEAMID}" IsChecked="{Binding isPinned}" Grid.Row="3" Grid.Column="1" Unchecked="subscribe_tb_Unchecked" Checked="subscribe_tb_Checked"/>
        </Grid>
</DataTemplate>

person Stu Ayton    schedule 31.07.2017    source источник
comment
Итак, когда вы перемещаетесь, он просто игнорировал кнопки внутри, или вы не видите никакого визуального фокуса?   -  person Justin XL    schedule 31.07.2017
comment
Визуальный фокус находится вокруг внешнего блока (в основном, сетки), и вы не можете переместить фокус с помощью контроллера на кнопки внутри, только на следующий элемент шаблона данных и т. д.   -  person Stu Ayton    schedule 31.07.2017
comment
Это, вероятно, долгий путь, но я думаю, вы можете попробовать сначала включить IsFocusEngagementEnabled на своем GridView, а затем установить IsTabStop на False в своем стиле GridViewItem.   -  person Justin XL    schedule 31.07.2017
comment
К сожалению, добавление IsFocusEngagementEnabled в GridView означает, что весь GridView имеет фокус, и вам нужно выбрать его, чтобы получить фокус на GridViewItems внутри.   -  person Stu Ayton    schedule 31.07.2017
comment
Это может быть для лучшей практики. Представьте, что когда пользователь хочет сфокусировать элемент управления ниже этого, ему нужно сначала просмотреть все внутри GridView. Но если вы этого не хотите, то все в порядке. Вы также пытались отключить IsTabStop GridViewItem?   -  person Justin XL    schedule 31.07.2017
comment
Я разработал пользовательский интерфейс, чтобы избежать подобных ситуаций, поэтому под GridView нет элементов управления. Да также отключил IsTabStop. Как будто мне нужно от IsFocusEngagementEnabled до False в фактическом DataTemplate   -  person Stu Ayton    schedule 31.07.2017
comment
Я думаю ответить на свой вопрос: есть три распространенные причины, по которым навигация XY может работать не так, как вы ожидаете: свойство IsTabStop или Visibility задано неправильно. Элемент управления, получающий фокус, на самом деле больше, чем вы думаете — навигация XY рассматривает общий размер элемента управления (ActualWidth и ActualHeight), а не только часть элемента управления, которая отображает что-то интересное. Один фокусируемый элемент управления находится поверх другого — навигация по осям XY не поддерживает перекрывающиеся элементы управления.   -  person Stu Ayton    schedule 31.07.2017
comment
Я думал о перекрытии, но в вашем xaml это не похоже на них?   -  person Justin XL    schedule 31.07.2017
comment
Я полагаю, поскольку кнопки находятся в элементе datatemplateitem, они классифицируются как перекрывающиеся?   -  person Stu Ayton    schedule 31.07.2017
comment
Давайте продолжим обсуждение в чате.   -  person Stu Ayton    schedule 31.07.2017


Ответы (1)


Решено путем изменения стиля GridView.ItemContainerStyle:

<GridView.ItemContainerStyle>
                <Style TargetType="GridViewItem">
                    <Setter Property="IsFocusEngagementEnabled" Value="True"/>
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                </Style>
</GridView.ItemContainerStyle>
person Stu Ayton    schedule 31.07.2017