Reputation: 3004
Here is the XAML:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="App1.MainPage">
<ListView ItemsSource="{Binding TestList}" SeparatorVisibility="None" HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<ContentView>
<Label Text="{Binding TestName}"></Label>
</ContentView>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>
Here is code-behind:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace App1
{
// Learn more about making custom code visible in the Xamarin.Forms previewer
// by visiting https://aka.ms/xamarinforms-previewer
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
this.BindingContext = this;
TestList.Add(new Test() { TestName = "aaa" });
TestList.Add(new Test() { TestName = "bbb" });
TestList.Add(new Test() { TestName = "ccc" });
TestList.Add(new Test() { TestName = "ddd" });
}
public ObservableCollection<Test> TestList { get; set; } = new ObservableCollection<Test>();
public class Test {
public string TestName { get; set; }
}
}
}
The project above will cross-platform running both in android and WPF.
In android:
When the item is hovered, there is not any style for true.
When the item is selected, it will change the color into orange and I can change it by changing the background of the Label.
Well, in WPF:
When selected or hovered the item, it will show a blue rectangle that I don't need.
I don't want to show the blue rectangle while selected or hovered the item in WPF, that's why I ask the question.
I probably know I should set some property in the WPF program while I don't know which property I should set it.
Would you please help me? Thank you.
Upvotes: 1
Views: 606
Reputation: 15021
You could try to use Custom Renderer to achieve this effect.
define ListViewItem
style in your App.xaml
of WPF project:
<Application.Resources>
<Style x:Key="LvItemStyle" TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Border x:Name="border" Background="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled" />
</VisualStateGroup>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected" />
<VisualState x:Name="Selected">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="border"
Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="LightBlue" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="SelectedUnfocused">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="border"
Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="SkyBlue" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
then create custom renderer in Wpf project,MyListView.cs
:
using System.Windows.Controls;
using WpfApp1;
using Xamarin.Forms.Platform.WPF;
[assembly: ExportRenderer(typeof(Xamarin.Forms.ListView), typeof(MyListView))]
namespace WpfApp1
{
class MyListView:ListViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged(e);
foreach (var item in Control.Children)
{
if (item is ListView)
{
var list = item as ListView;
list.ItemContainerStyle = App.Current.Resources["LvItemStyle"] as System.Windows.Style;
}
}
}
}
}
Upvotes: 1
Reputation: 662
Have you tried something like this.
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
But it loses all default behavior. U can use triggers and visual states incase customisation is required like mouse over effects and so on.
Upvotes: 0