Xamarin.Forms untappable ListView (удалить эффект пульсации выбора)
У меня есть ListView с настраиваемым ViewCell, который отображает статьи. Однако, когда вы выбираете элемент, он показывает эффект пульсации/выбора материала.
![Эффект пульсации]()
Xaml:
<ListView HasUnevenRows="True" ItemsSource="{Binding NewsArticles}" IsPullToRefreshEnabled="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Padding="10">
<Label Text="{Binding Title}" HorizontalOptions="Center" FontAttributes="Bold" />
<Image Source="{Binding ImageUrl}" IsVisible="{Binding HasImage}" />
<Label Text="{Binding Content}"></Label>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Как удалить эффект пульсации?
Update:
После некоторых исследований я нашел RepeaterView в библиотеке XLabs. Это работает, если вы оберните его в ScrollView, хотя он отнимает много аккуратной механики ListView, такой как обновление. Он также не поддерживает изменения ItemSource из внешнего потока. Все еще ищу другие решения, поскольку я знаю, что это возможно на родном Android.
Ответы
Ответ 1
Итак, после долгого, долгого времени мы это выяснили, вы можете выполнить его с помощью специального средства визуализации. Вот как,
Сначала создайте файл no_selector.xml и поместите его в папку Ресурсы/макеты (свойства упаковки должны быть установлены на AndroidResource).
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:drawable="@android:color/transparent"/>
</selector>
После этого создайте собственный визуализатор для компонента ListView,
[assembly: ExportRenderer (typeof(ListView), typeof(NoRippleListViewRenderer))]
namespace Your.Own.Namespace
{
public class NoRippleListViewRenderer : ListViewRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged (e);
Control.SetSelector (Resource.Layout.no_selector);
}
}
}
Если файл no_selector
не найден, перестройте свой проект!
Помните, что это устраняет пульсацию для all ListViews в вашем приложении. Если вы хотите, чтобы он нацелился на пару, вы можете изменить первый тип в атрибуте ExportRenderer (это требует от вас создания отдельного класса, который расширяет ListView).
https://gist.github.com/awatertrevi/d83787dbbf3de6ef0e0a344169d3c2fa
Ответ 2
Я думаю, вы можете удалить его без специального рендеринга.
Вы можете установить BackgroundColor
вашего StackPanel
на серый или любой другой цвет фона вашего списка или страницы.
<ListView HasUnevenRows="True" ItemsSource="{Binding NewsArticles}" IsPullToRefreshEnabled="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Padding="10" BackgroundColor="Gray">
<!-- ... -->
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Или вы можете использовать стили Android для изменения стилей вида списка:
Установить тему в AndroidManifest.xml
<application android:label="$safeprojectname$" android:theme="@style/myTheme"></application>
Создать тему в styles.xml
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<style name="myTheme" parent="@android:style/Theme.Material.Light">
<item name="android:listViewStyle">@style/ListViewStyle.Light</item>
</style>
<style name="ListViewStyle.Light" parent="@android:style/Widget.ListView">
<item name="android:listSelector">@android:color/transparent</item>
</style>
</resources>