2016-03-21 15 views
0

In UWP wird jedes Mal, wenn eine ListViewItem ausgewählt wird, ein Storyboard ausgelöst, um dem Benutzer das Gefühl zu geben, dass die Komponente auf den Druck einer Berührung reagiert. Dieses Storyboard ändert auch die Hintergrundfarbe der ListViewItem, bis sie freigegeben wird.Wie ändert man das visuelle Verhalten eines ListViewItem in UWP?

Ich habe eine UserControl entworfen, die eine ListView intern verwendet, aber möchte dieses Verhalten überschreiben, da es nicht wirklich das vorgeschlagene Design der Anwendung passt.

Bellow sind die VisualStateGroups Ich habe versucht, sowohl durch seine ControlTemplate zum ListView anzuwenden und ListViewItem durch seine DataTemplate Definition als der frühere Versuch schlug fehl.

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="CommonStates"> 
     <VisualState x:Name="Normal" /> 
     <VisualState x:Name="PointerOver" /> 
     <VisualState x:Name="Pressed" /> 
     <VisualState x:Name="PointerOverPressed" /> 
     <VisualState x:Name="Disabled" /> 
    </VisualStateGroup> 
    <VisualStateGroup x:Name="FocusStates"> 
     <VisualState x:Name="Focused" /> 
     <VisualState x:Name="UnFocused" /> 
     <VisualState x:Name="PointerFocused" /> 
    </VisualStateGroup> 
    <VisualStateGroup x:Name="SelectionStates"> 
     <VisualState x:Name="Unselecting" /> 
     <VisualState x:Name="Unselected" /> 
     <VisualState x:Name="UnselectedPointerOver" /> 
     <VisualState x:Name="UnselectedSwiping" /> 
     <VisualState x:Name="Selecting" /> 
     <VisualState x:Name="Selected" /> 
     <VisualState x:Name="SelectedSwiping" /> 
     <VisualState x:Name="SelectedUnfocused" /> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

Eine Möglichkeit könnte sein, das Stammnetz der DataTemplate zum ItemsContainer zu binden, so dass ich das Standardverhalten jedes Mal ein Element ausgewählt wurde außer Kraft setzen könnte. Aber ich bin nicht so versiert in XAML und konnte nicht den richtigen Weg finden, dies alleine zu tun.

Antwort

0

Es hat etwas gedauert, aber am Ende war es einfacher als erwartet. Ich musste nur eine ControlTemplate hinzufügen, die auf die ListViewItem abzielte, was ich vorher nicht tat, als ich mit der ControlTemplate der ListView hantierte.

Da wir die ListViewItem nicht direkt deklarieren, ist der Weg ListView.ItemContainerStyle zu verwenden. Das Endergebnis ist wie folgt:

<ListView.ItemContainerStyle> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ListViewItem"> 
        <ListViewItemPresenter /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListView.ItemContainerStyle> 

Wie Sie sehen können, wird ein leerer ListViewItemPresenter ist gut genug, um die meisten der Standardverhalten außer Kraft zu setzen. Ich konnte die drängenden Animationen nicht loswerden, bin aber mit den aktuellen Ergebnissen zufrieden.

0

Dies verwendet die ListViewItemPresenter, wie ich sicher bin, dass Sie entdeckt haben. Und ich bin sicher, Sie haben festgestellt, dass es nicht vorlagenfähig ist. Der Zweck dieses eingekapselten Ansatzes ist die reine Leistung. Daher sind Elemente in einem ListView zum Rendern messbar schneller. Es bedeutet jedoch, dass Sie, wenn Sie es ändern wollen, irgendwie feststecken. Bedeutet dies, dass Sie es nicht ändern können, um Ihren eigenen Präsentator zu verwenden und die Leistungsverbesserungen zu beheben? Bedeutet das, dass Sie viel benutzerdefinierten Code haben werden? Ja. Bedeutet es, dass es nicht möglich ist? Nein. Bedeutet es, dass es eine gute Idee ist? Gut. Ich weiß nicht, wie ich das beantworten soll. Aber zumindest weißt du, warum es eine Backsteinmauer zu sein scheint.

+0

Ist das irgendwo dokumentiert? Details finden Sie unter https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.primitives.listviewitempresenter nicht – Trevor

Verwandte Themen