我正在为一个Windows WPF应用程序创建插件。因此,我可以通过编程访问ListView,但无法编辑WPF源代码。
为了根据数据添加特殊格式的ListViewItem,我创建了自己的StyleSelector类,并将其实例分配给ListView的ItemContainerStyleSelector属性。
以下是源代码:
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;
}
}
这将使用旧选择器,并在列索引3包含
"3"
的值时添加红色背景。这很有效,但当ListView中的行悬停或选定时,仍会应用原始样式,并且红色背景会消失,直到该行被取消选定或取消悬停。
如何使得即使选定或悬停,也可以为这些行应用红色背景?
请记住,我无法编辑XAML,但可以以编程方式访问大多数属性。如果这是用JScript.NET编写的插件代码,则需要添加触发器到
newStyle
。 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);
没有效果。
newStyle.Triggers
- Brent StewartItemTemplate
和ItemTemplateSelector
都是null
。但是Template
有内容。那也可以应用吗? - ZoolWay