Robię dodatek do aplikacji WPF dla systemu Windows. Dlatego mogę uzyskać dostęp do ListView za pomocą programowania, ale nie można edytować źródła WPF.Programowa zmiana stylu listy ListView wybieraka
Aby dodać specjalne formatowanie dla ListViewItem
s zależnie od danych utworzyłem własną klasę StyleSelector
i przypisano jej instancję do właściwości ListView ItemContainerStyleSelector
.
Oto źródło:
public class MySelector extends System.Windows.Controls.StyleSelector {
private var oldSelector : System.Windows.Controls.StyleSelector;
public function MySelector(oldSelector : StyleSelector, debug : Object) {
this.oldSelector = oldSelector;
}
public function SelectStyle(item : Object, container : DependencyObject) : Style {
if (this.oldSelector != null) {
var oldStyle : System.Windows.Style = this.oldSelector.SelectStyle(item, container);
if (item[3] == "3") {
var newStyle : System.Windows.Style = new System.Windows.Style(oldStyle.TargetType, oldStyle);
newStyle.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Red));
return newStyle;
} else {
return oldStyle;
}
}
return null;
}
}
Dzieje stary wybieraka i dodaje czerwone tło, jeśli indeks kolumna 3 zawiera wartość równą "3"
.
To działa dobrze, ale gdy wiersz w widoku ListView jest zawijany lub zaznaczony, obowiązuje styl oryginalny, a czerwone tło zostaje utracone, dopóki linia nie zostanie wybrana lub odkryta.
Jak zastosować czerwone tło dla tych linii, nawet jeśli są one zaznaczone lub zawieszone?
Pamiętaj, że nie mogę edytować XAML, ale programowo uzyskuję dostęp do większości właściwości. W przypadku, gdy jest to kod addon napisany w JScript.NET.
mam teraz próbował dodać wyzwalaczy do newStyle
z programowaniem:
var t1 : Trigger = new Trigger();
t1.Property = ListBoxItem.IsSelectedProperty;
t1.Value = true;
t1.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Black));
newStyle.Triggers.Add(t1);
var t2 : Trigger = new Trigger();
t2.Property = UIElement.IsMouseOverProperty;
t2.Value = true;
t2.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Violet));
newStyle.Triggers.Add(t2);
var t3 : Trigger = new Trigger();
t3.Property = UIElement.IsFocusedProperty;
t3.Value = true;
t3.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Yellow));
newStyle.Triggers.Add(t3);
żadnego efektu.
można spojrzeć kolekcji wyzwalaczy na nowego stylu i wyjąć mouseover i unoszą wyzwalacze? 'newStyle.Triggers' –
Niestety oldStyle i newStyle nie mają żadnych wyzwalaczy. Czy mogą pochodzić z tematu? @BrentStewart – ZoolWay
Te efekty zawisu i selekcji myszy można zdefiniować w szablonie elementu (który jest DataTemplate). Najpierw musisz zbadać i dowiedzieć się, gdzie znajdują się wyzwalacze. Możesz użyć, na przykład, ILSpy, aby dekompilować kod xaml z binariów – Woodman