2016-03-21 2 views
0

В UWP, каждый раз выбирается ListViewItem, раскадровка запускается, чтобы дать пользователю ощущение, что компонент реагирует на давление прикосновения. Эта раскадровка также меняет цвет фона ListViewItem, пока он не будет выпущен.Как изменить визуальное поведение ListViewItem в UWP?

Я разработал UserControl, который использует внутреннее устройство ListView, но хотел бы переопределить это поведение, так как оно действительно не соответствует предлагаемому дизайну приложения.

пыльника является VisualStateGroups я попытался применить как к ListView через ControlTemplate и ListViewItem через DataTemplate определения несостоявшейся бывшую попытку.

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

Одним из возможных вариантов может быть, чтобы связать корневую сетку с DataTemplate к ItemsContainer так, что я мог бы переопределить поведение по умолчанию каждый раз, когда был выбран пункт. Но я не настолько разбираюсь в XAML и не мог понять, как правильно это сделать сам.

ответ

0

Это заняло некоторое время, но в конце было проще, чем ожидалось. Мне просто нужно было добавить ControlTemplate с таргетингом на ListViewItem, которого я раньше не делал, так как я застрял в игре с ControlTemplateListView.

Как мы не объявляем ListViewItem напрямую, можно использовать ListView.ItemContainerStyle. Окончательный результат выглядит следующим образом:

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

Как вы можете видеть, пустой ListViewItemPresenter достаточно хорошо, чтобы переопределить большинство поведение по умолчанию. Я не мог избавиться от нажимающей анимации, но я доволен текущими результатами.

0

Используется ListViewItemPresenter, поскольку я уверен, что вы обнаружили. И, я уверен, вы обнаружили, что это не шаблон. Цель этого более инкапсулированного подхода - чисто производительность. В результате элементы в ListView значительно быстрее визуализируются. Однако это означает, что когда вы хотите изменить его, вы как бы застряли. Означает ли это, что вы не можете изменить его, чтобы использовать своего собственного докладчика и ускорить повышение производительности? Означает ли это, что у вас будет много настраиваемого кода? Да. Означает ли это, что это невозможно? Нет. Это значит, что это хорошая идея? Что ж. Я не знаю, как ответить на этот вопрос. Но, по крайней мере, вы знаете, почему это кирпичная стена.

+0

Является ли это документированным где угодно? Не см. Подробности на https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.primitives.listviewitempresenter – Trevor