我有一个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
事件发生的位置,并确定它是否在我定义的禁用区域。
有可能吗?还有其他想法吗?
答案 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>
摆脱这个区域:
而不是:
答案 2 :(得分:0)
建议1
您可以收听ManipulationStarted
的{{1}}根,并检查事件处理程序中的DataTemplate
是否输入靠近按钮。如果距离太近,请将e.Position
设置为bool
为true,并在IsCloseToStepperButtons
事件处理程序中检查该bool。
尚未对此进行测试,但我认为事件是按照所需顺序触发的。
建议2
您可以跳过整个ItemClick
事件,并将事件侦听器添加到ItemClick
的其他部分。在两个部分之间留一个边距,以防止意外点击。