【问题标题】:How to set difference pointer over color for each row in ListView UWP如何为ListView UWP中的每一行设置颜色差异指针
【发布时间】:2021-03-25 15:59:42
【问题描述】:

我试图制作一个具有某些行的 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 uwp


    【解决方案1】:

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

    您可以在DataTemplateListView.ItemTemplate 中的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);
    }
    

    【讨论】:

    • 我在您回答之前找到了解决方案,但或多或​​少与您的想法相同。无论如何,谢谢大家!
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多