Dlaczego to jest trudne?
Można zmienić DataTemplate
w taki sposób, że każdy ListViewItem
zostanie podzielony na dwie części, „części kwoty zmiana” i „info części elementu”:
<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>
Teraz można spróbować jednego z następujące sposoby obsłużyć ItemClick
odpowiednio:
pierwsze rozwiązanie: można dowiedzieć się, co było OriginalSource który podniósł ItemClick
wydarzenie. czy to „część kwoty zmiana” , następnie użytkownik prawdopodobnie wykorzystać go przez pomyłkę, a zdarzenie powinno zostać anulowane, jeśli to było „Info część elementu za” następnie zdarzenie powinno zostać podniesione:
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
}
Drugie rozwiązanie: Można ustawić ListView
na SelectionMode="None"
i IsItemClickEnabled="False"
, a następnie dodałem Obsługiwane klawisze ręczne dla każdego elementu ręcznie (np.ItemTapped
dla części elementu informacji i OnIncreaseTapped
i OnDecreaseTapped
dla przycisków):
<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>
trzecie rozwiązanie: Dlaczego nawet pozwolić użytkownikowi na dotknij niewłaściwy obszar? Wolałbym pozbyć tej dziedzinie stosując ItemTemplate
takiego:

zamiast tego:

Dziękujemy! To naprawdę proste, eleganckie rozwiązanie! – WPMed
e.OriginalSource jest zawsze ListView dla mnie, w jaki sposób otrzymałeś "disabledArea"? – garenyondem