2015-07-17 6 views
13

Ich habe eine ListView, die die Produkte in einem Einkaufswagen zeigt. Die datatemplate definiert eine Inkrement und eine Dekrement Schaltfläche für jedes Produkt.Position des ItemClick-Ereignisses auf einem ListView Windows Phone 8.1

Wenn der Benutzer auf eine dieser Schaltflächen tippen möchte, besteht die Möglichkeit, dass er neben der Schaltfläche klickt, sodass das Ereignis ItemClick ausgelöst wird. Ich möchte ItemClick im Bereich der Schaltfläche deaktivieren. Ich hatte eine Idee, die Position zu erhalten, wo das ItemClick Ereignis auftrat, und festzustellen, ob es in dem deaktivierten Bereich ist, den ich definierte.

Ist es möglich? Irgendeine andere Idee?

Antwort

7

Es gibt eine einfache Möglichkeit, dies zu tun. Verwenden Sie ein Element als "deaktivierten Bereich" um diese Inkrement/Dekrement-Schaltflächen. Im ItemClick Handler, sagen Sie if (e.OriginalSource == **the element which is the disabled area**) return;.

Dies funktioniert, weil die ItemClickedEventArgs eine RoutedEventArgs ist, die immer das Element enthält, aus dem es stammt. Siehe https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.itemclickeventargs

+0

Vielen Dank! Es ist in der Tat eine wirklich einfache, elegante Lösung! – WPMed

+0

e.Original Source ist immer ListView für mich, wie hast du den "disabledArea" bekommen? – garenyondem

0

Vorschlag 1
Sie könnten in der Lage sein zu ManipulationStarted Wurzel der DataTemplate und überprüfen Sie die e.Position in den Event-Handler zu hören, wenn der Eingang in der Nähe der Tasten war. Wenn es zu nah ist, setze bool wie IsCloseToStepperButtons auf true und überprüfe das Ereignis im ItemClick Event-Handler.

Ich habe das nicht getestet, aber ich denke, dass die Ereignisse in der gewünschten Reihenfolge ausgelöst werden.

Vorschlag 2
Sie können das ganze ItemClick Ereignis überspringen und einen Ereignis-Listener auf den anderen Teil der DataTemplate hinzuzufügen. Legen Sie einen Abstand zwischen den beiden Teilen fest, um versehentliche Klicks zu vermeiden.

+0

Leider hat es nicht funktioniert. Das ManipulationStarted-Ereignis wird nicht ausgelöst. – WPMed

2

Warum auf die harte Tour?

Sie können die DataTemplate in einer Art und Weise ändern, dass jeder ListViewItem in zwei Teile geteilt wird, „Änderungsbetrag Teil“ und „item Info Teil“:

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

Jetzt können Sie versuchen, eine die folgenden Möglichkeiten ItemClick richtig zu handhaben:

Erste Lösung: können Sie herausfinden, was die OriginalSource war, der die 012 angehobenEreignis. wenn es der „Änderungsbetrag Teil“ war, dann wahrscheinlich Benutzer tippte versehentlich und die Veranstaltung abgebrochen werden soll, wenn es ist „item Info Teil“ dann sollte das Ereignis ausgelöst werden:

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 
    } 

Zweite Lösung: Sie können die ListView auf SelectionMode="None" und IsItemClickEnabled="False" einstellen, und dann habe ich Tapped Handler für jedes Element manuell hinzugefügt (z. B.ItemTapped für Stück Info Teil und OnIncreaseTapped und OnDecreaseTapped für die Tasten):

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

Dritte Lösung: Warum auch Benutzer lassen den falschen Bereich zu erschließen? Ich würde eher die Befreiung von diesem Bereich erhalten, indem eine ItemTemplate wie folgt aus:

enter image description here

statt dessen:

enter image description here

Verwandte Themen