如何在 ListView UWP 中为每一行设置颜色差异指针

How to set difference pointer over color for each row in 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));
            }
           
        }

但看起来它不起作用。那你能帮我个忙吗?

即使它可能会起作用,我也不确定这是个好主意。

如果您试图根据某些条件用不同的颜色突出显示某些行项目,最好有一个数据模板来实现它。

例如,在您的列表视图中,您可能有这样的内容:

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

在您的数据模板中,您可以使用不同的选项来应用不同的悬停颜色,例如触发器、转换器(绑定到模型 属性)或模板选择器

在您的代码中,lvResult.SelectedItem 不是指针指向的项目。

您可以在 ListView.ItemTemplateDataTemplate 中的 Grid 中添加 PointerEntered 事件来设置网格的背景。您需要在以下代码中替换您的数据绑定。

请检查以下代码作为示例:

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);
}