Подтвердить что ты не робот

Позиция события ItemClick на Windows Phone ListView 8.1

У меня есть ListView, который показывает продукты в корзине покупок. datatemplate определяет кнопку приращения и декремент для каждого продукта.

Если пользователь хочет нажать одну из этих кнопок, есть вероятность, что они коснутся кнопки, поэтому произойдет событие ItemClick. Я хочу отключить ItemClick в области кнопки. У меня возникла идея получить позицию, в которой произошло событие ItemClick, и определить, находится ли она в отключенной области, которую я определил.

Возможно ли это? Любая другая идея?

4b9b3361

Ответ 1

Есть простой способ сделать это. Используйте этот элемент как "отключенную область" вокруг этих кнопок увеличения/уменьшения. В обработчике ItemClick скажите if (e.OriginalSource == **the element which is the disabled area**) return;.

Это работает, потому что ItemClickedEventArgs является RoutedEventArgs, который всегда содержит элемент, из которого он произошел. См. https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.itemclickeventargs

Ответ 2

Зачем это делать сложно?

Вы можете изменить DataTemplate таким образом, чтобы каждый ListViewItem делился на две части: "часть суммы изменения" и "информация о деталях":

    <ListView ItemClick="OnItemClick">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="100"/>
                                </Grid.ColumnDefinitions>
                                <!-- This is the item info part -->
                                <StackPanel Orientation="Horizontal" Grid.Column="0" >
                                    <TextBlock Text="{Binding Title}" />
                                    <TextBlock Text="{Binding Qnty}" />
                                </StackPanel>
                                <!-- This is the change amount part -->
                                <StackPanel Tag="Oops!" Orientation="Horizontal" Grid.Column="1" >
                                    <Button Content="▲" />
                                    <Button Content="▼" />
                                </StackPanel>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

Теперь вы можете попробовать один из следующих способов правильно обрабатывать ItemClick:

Первое решение:. Вы можете узнать, что было OriginalSource, в результате чего событие ItemClick, если это была "часть суммы изменения", тогда пользователь, вероятно, постучал по ошибке, и событие должно быть отменено, если это была "информация о деталях", тогда событие должно быть поднято:

    private void OnItemClick(object sender, ItemClickEventArgs e)
    {
        var tag = ((FrameworkElement)e.OriginalSource).Tag;

        if (tag != null && tag.ToString() == "Oops!")
        {
            return;
        }
        //else: do whatever needs to be done on item click
    }

Второе решение: Вы можете установить ListView на SelectionMode="None" и IsItemClickEnabled="False", а затем я добавил обработчики Tapped для каждого элемента вручную (например, ItemTapped для элемента информации о товаре и OnIncreaseTapped и OnDecreaseTapped для кнопок):

    <ListView ItemClick="OnItemClick" SelectionMode="None" IsItemClickEnabled="False">
         ...
                                <!-- This is the item info part -->
                                <StackPanel Orientation="Horizontal" Tapped = "OnItemTapped" Grid.Column="0" >
                                    <TextBlock Text="{Binding Title}" />
                                    <TextBlock Text="{Binding Qnty}" />
                                </StackPanel>
                                <!-- This is the change amount part -->
                                <StackPanel Tag="Oops!" Orientation="Horizontal" Grid.Column="1" >
                                    <Button Content="▲" Tapped = "OnIncreaseTapped"/>
                                    <Button Content="▼" Tapped = "OnDecreaseTapped"/>
                                </StackPanel>
                            </Grid>

Третье решение: Почему даже позволить пользователю использовать неправильную область? Я бы скорее избавился от этой области, используя ItemTemplate следующим образом:

введите описание изображения здесь

вместо этого:

введите описание изображения здесь

Ответ 3

Предложение 1
Возможно, вы сможете прослушать ManipulationStarted root из DataTemplate и проверить e.Position в обработчике событий, если вход был рядом с кнопками. Если он слишком близко, установите a bool like IsCloseToStepperButtons в true и проверьте этот bool в обработчике события ItemClick.

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

Предложение 2
Вы можете пропустить все событие ItemClick и добавить прослушиватель событий в другую часть DataTemplate. Поместите разницу между двумя частями, чтобы предотвратить случайные клики.