2015-07-17 13 views
13

Mam ListView, która pokazuje produkty w koszyku. Numer datatemplate definiuje przycisk kwotowania izmniejszający kwotę dla każdego produktu.Pozycja zdarzenia ItemClick na liście Windows Phone 8.1

Jeśli użytkownik chce dotknąć jednego z tych przycisków, istnieje ryzyko, że dotkną obok przycisku, aby zdarzenie ItemClick zostało wyzwolone. Chcę wyłączyć ItemClick w obszarze przycisku. Miałem pomysł, aby uzyskać pozycję, w której nastąpiło zdarzenie ItemClick, i określić, czy znajduje się on w obszarze, który zdefiniowałem.

Czy to możliwe? Każdy inny pomysł?

Odpowiedz

7

Jest prosty sposób na zrobienie tego. Użyj elementu jako "obszaru wyłączonego" wokół przycisków zwiększania/zmniejszania. W instrukcji obsługi ItemClick powiedzmy if (e.OriginalSource == **the element which is the disabled area**) return;.

Działa to, ponieważ ItemClickedEventArgs to RoutedEventArgs, który zawsze zawiera element, z którego pochodzi. Zobacz https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.itemclickeventargs

+0

Dziękujemy! To naprawdę proste, eleganckie rozwiązanie! – WPMed

+0

e.OriginalSource jest zawsze ListView dla mnie, w jaki sposób otrzymałeś "disabledArea"? – garenyondem

0

Sugestia 1
Możesz być w stanie słuchać ManipulationStarted korzenia DataTemplate i sprawdź e.Position w obsłudze zdarzenia jeśli wejście było blisko przycisków. Jeśli jest zbyt blisko, ustaw wartość bool podobną do IsCloseToStepperButtons na wartość true i sprawdź, czy w instrukcji obsługi zdarzenia znajduje się wartość bool.

Nie testowałem tego, ale myślę, że zdarzenia są uruchamiane w pożądanej kolejności.

Sugestia 2
Można pominąć cały ItemClick zdarzenie i dodać detektor zdarzeń do innej części DataTemplate. Umieść margines między dwiema częściami, aby zapobiec przypadkowym kliknięciom.

+0

Niestety to nie działa. Zdarzenie ManipulationStarted nie uruchamia się. – WPMed

2

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:

enter image description here

zamiast tego:

enter image description here

Powiązane problemy