以编程方式更改ListView选择器的样式

5

我正在为一个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 Stewart
很不幸,oldStyle和newStyle都没有任何触发器。它们可能来自主题吗?@BrentStewart - ZoolWay
这些鼠标悬停和选择效果可以在项模板(即DataTemplate)中定义。您首先需要调查并找出触发器的位置。例如,您可以使用ILSpy从二进制文件反编译XAML代码。 - Woodman
嗯,这是一个很好的提示。我刚刚检查了一下。ItemTemplateItemTemplateSelector都是null。但是Template有内容。那也可以应用吗? - ZoolWay
2个回答

3

抱歉,正如问题所述,我已经使用了ItemContainerStyleSelector。问题在于,我可以影响正常行的样式,但无法影响悬停或选定行的样式。 - ZoolWay

3
我会使用资源库并在那里操纵触发器等。 开始使用 示例:
<Style x:Key="MenuButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="#FF494646"/>
    <Setter Property="Foreground" Value="#FFE5E5E5"/>
    <Setter Property="TextOptions.TextFormattingMode" Value="Display"></Setter>
    <Setter Property="Cursor" Value="Hand"></Setter>
    <Setter Property="Effect">
        <Setter.Value>
            <DropShadowEffect Opacity="0.7"/>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Black"/>
        </Trigger>
        <Trigger Property="IsFocused" Value="True">
            <Setter Property="Background" Value="ForestGreen"></Setter>
            <Setter Property="Foreground" Value="Black"/>
        </Trigger>
    </Style.Triggers>
</Style>

很遗憾,我无法添加或修改XAML,但我已尝试通过编程来实现,详见更新的问题。但是它没有起作用。 - ZoolWay
如果我的评论没有帮到你,我很抱歉。但是,你不能访问是不是因为你目前的限制和问题? - user1656632
是的,因为我的代码是一个“插件”产品,通过接口我可以获取列表,但无法更改编译后的XAML。 - ZoolWay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接