代码之家  ›  专栏  ›  技术社区  ›  WPMed

ListView Windows Phone 8.1上ItemClick事件的位置

  •  14
  • WPMed  · 技术社区  · 9 年前

    我有一个 ListView 其显示了购物车中的产品。这个 datatemplate 定义 定期的加薪 和一个 减量,减量 每个产品的金额按钮。

    如果用户想点击其中一个按钮,他们有可能点击按钮旁边的按钮,因此 ItemClick 事件将被触发。我想禁用 项目单击 在按钮区域中。我有一个主意 项目单击 事件发生,并确定它是否在我定义的禁用区域中。

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

    3 回复  |  直到 9 年前
        1
  •  7
  •   Tamás Deme    9 年前

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

    为什么要这么做?

    您可以更改 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'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 正确:

    第一种解决方案: 你可以找出 OriginalSource 这提高了 项目单击 事件如果是 “更改金额部分” ,则用户可能错误地点击了它,如果是,则应该取消该事件 “项目的信息部分” 则应引发事件:

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

    第三种解决方案: 为什么让用户点击错误的区域?我宁愿使用 ItemTemplate 这样地:

    enter image description here

    而不是:

    enter image description here

        3
  •  0
  •   Jon G Stødle    9 年前

    建议1
    你也许可以听 ManipulationStarted DataTemplate 并检查 e.Position 在事件处理程序中,如果输入靠近按钮。如果距离太近,设置 bool 喜欢 IsCloseToStepperButtons 为真,并检查 ItemClick 事件处理程序。

    还没有测试过,但我认为事件是按照期望的顺序启动的。

    建议2
    你可以跳过整个 项目单击 事件,并将事件侦听器添加到 数据模板 。在两个部分之间留有边距,以防止意外点击。