5

我正在做一个 Windows WPF 应用程序的插件。因此,我可以通过编程访问 ListView,但不能编辑 WPF 源。

ListViewItem要根据数据为 s 添加特殊格式,我创建了自己的StyleSelector类并将其实例分配给 ListViewItemContainerStyleSelector属性。

这是来源:

  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);

没有效果。

4

2 回答 2

3

您可以在 WPF 中使用 StyleSelector 机制。

http://msdn.microsoft.com/tr-tr/library/system.windows.controls.styleselector.aspx

http://www.shujaat.net/2010/10/wpf-style-selector-for-items-in.html

于 2013-03-27T14:18:42.853 回答
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>
于 2013-03-12T15:34:08.350 回答