Я пытаюсь создать 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
не является элементом, на который указывает указатель.
Вы можете добавить событие 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);
}
Я нашел решение до вашего ответа, но более или менее оно совпадает с вашей идеей. В любом случае, спасибо за все!