ItemClick事件在ListView Windows Phone 8.1上的位置

时间:2015-07-17 11:14:36

标签: c# windows-phone-8.1 winrt-xaml

我有一个for el in $(adb shell ls /mnt/sdcard/ | grep mem_ | sed -r 's/[\r]+//g'); do adb pull /mnt/sdcard/${el} android_mem; done ,用于显示购物车中的商品。 ListView为每个产品定义增量减量数量按钮。

如果用户想要点击其中一个按钮,则可能会点按该按钮旁边的,因此会触发datatemplate事件。我想在按钮区域禁用ItemClick。我想知道ItemClick事件发生的位置,并确定它是否在我定义的禁用区域。

有可能吗?还有其他想法吗?

3 个答案:

答案 0 :(得分:7)

有一种简单的方法可以做到这一点。使用元素作为这些递增/递减按钮周围的“禁用区域”。在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

答案 1 :(得分:2)

为什么要这么做呢?

您可以更改DataTemplate,方法是将每个ListViewItem分为两部分,"更改金额部分" & #34;项目信息部分"

    <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's 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

第一个解决方案:您可以了解引发ItemClick事件的OriginalSource是什么。如果是&#34;更改金额部分&#34; ,那么用户可能会错误地点击它并且该事件应该被取消,如果它是&#34; item&#39; s info part&#34; 然后应该引发事件:

    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用于项目的信息部分和{{ 1}}和OnIncreaseTapped按钮):

OnDecreaseTapped

第三种解决方案: 为什么甚至让用户点击错误的区域?我宁愿使用这样的 <ListView ItemClick="OnItemClick" SelectionMode="None" IsItemClickEnabled="False"> ... <!-- This is the item's 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> 摆脱这个区域:

enter image description here

而不是:

enter image description here

答案 2 :(得分:0)

建议1
您可以收听ManipulationStarted的{​​{1}}根,并检查事件处理程序中的DataTemplate是否输入靠近按钮。如果距离太近,请将e.Position设置为bool为true,并在IsCloseToStepperButtons事件处理程序中检查该bool。

尚未对此进行测试,但我认为事件是按照所需顺序触发的。

建议2
您可以跳过整个ItemClick事件,并将事件侦听器添加到ItemClick的其他部分。在两个部分之间留一个边距,以防止意外点击。