Как установить указатель различия по цвету для каждой строки в ListView UWP

Я пытаюсь создать ListView, в котором некоторые строки будут иметь разный цвет PointerOver с другими (зависит от привязки данных к этим строкам). В настоящее время я пытался изменить ListViewItemBackgroundSelected, когда указатель перемещается в любую строку

private void lvResult_PointerEntered(object sender, PointerRoutedEventArgs e)
        {
            lvResult.SelectedItem = ((FrameworkElement)sender).DataContext;
            Debug.WriteLine("Hover Item :" + lvResult.SelectedIndex);
            if (lvResult.SelectedIndex % 2 == 0){ //just put sample condition here
            lvResult.Resources["ListViewItemBackgroundPointerOver"] = new SolidColorBrush(Color.FromArgb(150, 250, 12, 170));
            lvResult.Resources["ListViewItemBackgroundSelected"] = new SolidColorBrush(Color.FromArgb(150, 250, 12, 170)); 
       lvResult.Resources["ListViewItemBackgroundSelectedPointerOver"] = new SolidColorBrush(Color.FromArgb(150, 250, 12, 170));
            }else{
            lvResult.Resources["ListViewItemBackgroundPointerOver"] = new SolidColorBrush(Color.FromArgb(150, 255, 0, 255));
            lvResult.Resources["ListViewItemBackgroundSelected"] = new SolidColorBrush(Color.FromArgb(150, 255, 0, 255));   
     lvResult.Resources["ListViewItemBackgroundSelectedPointerOver"] = new SolidColorBrush(Color.FromArgb(150, 255, 0, 255));
            }
           
        }

Но похоже не работает. Так не могли бы вы помочь мне?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Даже если это потенциально сработает, я не уверен, что это хорошая идея.

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

Например, в вашем списке у вас может быть что-то вроде этого:

<ListView
    SelectionMode = "Single"
    ItemTemplate = "{StaticResource ListViewTemplate}"/>

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

Ответ принят как подходящий

В вашем коде lvResult.SelectedItem не является элементом, на который указывает указатель.

Вы можете добавить событие PointerEntered в Grid внутри DataTemplate из ListView.ItemTemplate, чтобы установить фон сетки. Вам необходимо заменить привязку данных в следующем коде.

Пожалуйста, проверьте следующий код в качестве образца:

public sealed class MyClass
{
    public bool flag { get; set; }
    public string Name { get; set; }
    public MyClass()
    {
        flag = false;
        Name = "name";
    }
}



//MainPage.xaml
<ListView x:Name = "lvResult" ItemsSource = "{x:Bind collections}"> //Replace your data binding here
    <ListView.ItemTemplate>
        <DataTemplate x:Name = "dt" x:DataType = "local:MyClass">
            <Grid x:Name = "itemGrid" Height = "40" Width = "1000"
                        PointerExited = "itemGrid_PointerExited"
                        PointerEntered = "itemGrid_PointerEntered">
                <TextBlock Text = "{x:Bind Name}" ></TextBlock>  //Replace your data binding here
                <TextBlock x:Name = "tb" Visibility = "Collapsed" Text = "{x:Bind flag}"/>  //Replace your data binding here
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

//MainPage.xaml.cs
private ObservableCollection<MyClass> collections;

private void itemGrid_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    var grid = sender as Grid;
    var myClass = grid.DataContext as MyClass;

    if (myClass!=null)
    {
        if (myClass.flag==true)
        {
            grid.Background = new SolidColorBrush(Colors.Red);
        }
    }
}



private void itemGrid_PointerExited(object sender, PointerRoutedEventArgs e)
{
    var grid = sender as Grid;
    grid.Background = new SolidColorBrush(Colors.White);
}

Я нашел решение до вашего ответа, но более или менее оно совпадает с вашей идеей. В любом случае, спасибо за все!

MauMau 16.12.2020 09:29

Другие вопросы по теме