Как я могу изменить цвет фона ListView в Xaml? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть ListView, и мне нужно заменить его собственные цвета (как выбранного элемента, так и других элементов) на другие цвета.Я не смог найти, как это сделать.Я могу изменить цвет фона на что-то другое (см. Мой код ниже), но я не знаю, как заставить его вести себя как обычный ListView, меняя цвета элементов при выделении.

Вот мой код:

    <ListView x:Name="MenuItemsListView"
          SeparatorVisibility="None"
          HasUnevenRows="true"
          ItemsSource="{Binding MenuItems}">
  <ListView.Header>
    <Grid BackgroundColor="Black">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="10"/>
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
        <RowDefinition Height="10"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="10"/>
      </Grid.RowDefinitions>
        <Image Grid.Column="1" Grid.Row="1" WidthRequest="50" HeightRequest="50" HorizontalOptions="StartAndExpand" Source="Assets\logo.png" />
    </Grid>
  </ListView.Header>
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell Height="100">
         <StackLayout Padding="15,10" 
                                 Orientation="Horizontal" 
                                 HorizontalOptions="FillAndExpand" 
                                 BackgroundColor="{StaticResource LogoBackgroundColor}">
              <Image WidthRequest="50" Source="{Binding IconSource}" />
              <Label VerticalOptions="FillAndExpand" 
                VerticalTextAlignment="Center" 
                Text="{Binding Title}" 
                FontSize="24"/>
        </StackLayout>
      </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Вам необходимо сбросить itemcontainerstyle .Так что свойства выбранных элементов по умолчанию переопределяются.Затем вам нужно создать несколько триггеров для элемента DataTemplate.

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

<Style x:Key="StyleListViewItem" TargetType="ListViewItem">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <ContentPresenter/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

После того, как вы создали вышеуказанный стиль, используйте его следующим образом.( Фрагмент из моей существующей работы. Используйте его так, как он подходит к вашей работе )

                            <ListView ItemContainerStyle="{StaticResource StyleListViewItem}" Background="{x:Null}" BorderBrush="{x:Null}" ItemsSource="{Binding Value}">
                                <ListView.ItemTemplate>
                                    <DataTemplate>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="Auto"/>
                                                <ColumnDefinition Width="2.5*"/>
                                            </Grid.ColumnDefinitions>
                                            <TextBlock Grid.Column="0" Text="{Binding Key}" TextWrapping="WrapWithOverflow" />
                                            <TextBlock Grid.Column="1" Text=":" Margin="3,0"/>
                                            <TextBlock Grid.Column="2" Text="{Binding Value}" Style="{StaticResource StyleTblckAnswer}" TextWrapping="WrapWithOverflow"/>
                                        </Grid>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                            </ListView>
                 

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

0 голосов
/ 03 декабря 2018

Вы не можете делать что-то подобное в XAML.Вы можете сделать что-то вроде предлагаемого решения , если оно не работает, вы можете поместить Grid в ViewCell и изменить его цвет, это самое близкое вам значение только к XAML.Но это довольно неэффективно.

Единственное верное решение вашей проблемы - на родной стороне.На Android это довольно просто, вы можете отредактировать styles.xml, чтобы добиться этого.На других платформах вам нужно будет писать собственные средства визуализации.

0 голосов
/ 03 декабря 2018

Это может быть возможно, используя Triggers в xaml, кто знает.Но это также служит вашей цели.Чтобы изменить color из выбранного ViewCell, существует простой обходной путь без использования пользовательского рендерера.Сделайте Tapped событие вашего ViewCell, как показано ниже

<ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell Tapped="ViewCell_Tapped">            
       <StackLayout></StackLayout>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>

В вашем файле ContentPage ss, внедрите событие

private void ViewCell_Tapped(object sender, System.EventArgs e)
{
    if(lastCell!=null)
        lastCell.View.BackgroundColor = Color.Transparent;
    var viewCell = (ViewCell)sender;
    if (viewCell.View != null)
    {
        viewCell.View.BackgroundColor = Color.Red;
        lastCell = viewCell;
    }
}

Объявите lastCell в верхней частиваш ContentPage вот так ViewCell lastCell;

Вывод экрана:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...