Могу ли я изменить цвет фона в ячейках ListView без потери тактильной (сенсорной) обратной связи?

(Я спросил на форумы Xamarin но не получил ответа, поэтому я пытаюсь здесь)

в формах Xamarin настройка BackgroundColor в ListView ItemTemplate приводит к отключению тактильной обратной связи.

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

пример XAML:

 <ListView x:Name="list"
           ItemTapped="OnItemSelected"
           IsGroupingEnabled="True"
           GroupDisplayBinding="{Binding Key}"
           GroupShortNameBinding="{Binding Key}"
           HasUnevenRows="True"
           ItemsSource="{Binding .}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
              <StackLayout VerticalOptions="FillAndExpand"
                           Padding="5, 20"
                           BackgroundColor="#CCCCCC"> <!--This line causes haptic feedback to fail -->
                <Label Text="{Binding Name}"
                       TextColor="Black"
                       VerticalOptions="Center"
                       FontSize="Large"/>
              </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

ближайший Я получил меняет BackgroundColor на ViewCell.Tapped, затем изменить его обратно в View.OnAppearing() (ViewCell.Appearing сломан), но это меняет фон, когда палец поднят, а не когда он нажат.

Я тестирую на Android, но предпочел кросс-платформенное решение.

3 ответов


проверьте свой пост на форуме Xamarin для моих отзывов. У меня есть простое решение для вас под названием XFGloss. Это бесплатное дополнение с открытым исходным кодом для Xamarin.Формы. Источник доступен на GitHub. Существует также пакета NuGet доступен. Он позволяет назначить значение BackgroundColor стандартным элементам управления ячейками XF (TextCell, EntryCell и т. д.). Есть несколько других новых свойств, также добавленных XFGloss.

Если вы предпочитаете исправить существующая реализация, вы можете просмотреть изменения, которые я сделал для поддержки визуальной обратной связи в этом код commit.


как только вы установите цвет фона, вы не увидите выбранный цвет элемента или тактильную обратную связь, если вы не создадите пользовательский рендеринг на каждой платформе.

вот работа, которую вы можете реализовать, которая является кросс-платформенной и MVVM на основе использования Привязок для установки цвета выбранного элемента:

  1. привязать свойство к SelectedItem of ListView.
  2. привязать цвет фона StackLayout к автоматическому свойству и установите значение "#CCCCCC", если его не выбран элемент еще какой-то другой цвет.
  3. вам нужно подписаться на свойство SelectedMyItem в MyItem класса и вызвать OnPropertyChanged свойства BackgroundColor. Для этого вы можете поднять событие и подписаться или что-нибудь, что вы чувствуете себя комфортно.(это не реализовано в приведенном ниже примере псевдокода)

ViewModel:

public class MyViewModel : IMyViewModel
{
    public ObserveableCollection<MyItem> Items { get; set; }
    public MyItem SelectedMyItem { get; set; }
}

список класса item :

public class MyItem 
{
    private readonly IMyViewModel _myViewModel;

    public MyItem(IMyViewModel myViewModel)
    {
        _myViewModel = myViewModel;
    }

    public string Name { get; set; }
    public Color BackgroundColor => _myViewModel.SelectedMyItem == this 
                                    ? Color.Red : Color.FromHex("CCCCCC");        
}

XAML:

<ListView x:Name="list"
           IsGroupingEnabled="True"
           GroupDisplayBinding="{Binding Key}"
           GroupShortNameBinding="{Binding Key}"
           HasUnevenRows="True"
           ItemsSource="{Binding Items}"
           SelectedItem="{Binding SelectedMyItem}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
              <StackLayout VerticalOptions="FillAndExpand"
                           Padding="5, 20"
                           BackgroundColor="{Binding BackgroundColor}">
                   <StackLayout.GestureRecognizers>
                       <TapGestureRecognizer Tapped="OnItemTapped" />
                   </StackLayout.GestureRecognizers>
                <Label Text="{Binding Name}"
                       TextColor="Black"
                       VerticalOptions="Center"
                       FontSize="Large"/>
              </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

виброотклик обойти :

обычно касание 200-300мс. После того, как элемент постучал вы можете изменить цвет фона на столько времени, а затем установить исходный цвет.

public async void OnItemTapped(object sender, EventArgs args) 
{
   BackgroundColor = Color.Orange; //touch color
   await Task.Delay(250);          //time to show new color
   BackgroundColor = Color.Red;    //original color
}

вы даже можете улучшить это дальше, пытаясь включить анимации, может быть FadeTo для изменения цвета.


вы можете просто использовать это в своем унаследованном классе Viewcell,

this.Tapped += ViewCell_Tapped; / / с помощью tapped в вашем viewcell вы можете достичь, как тактильные.

private async void ViewCell_Tapped (отправитель объекта, EventArgs в электронной) { этот.Вид.Свойство BackgroundColor = Цвет.Серый; жду задания.Задержка(10);
этот.Вид.Свойство BackgroundColor = Цвет.Белый; }

это работает для меня.