如何在 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.ItemTemplate
的 DataTemplate
中的 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);
}
我试图制作一个包含某些行的 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.ItemTemplate
的 DataTemplate
中的 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);
}