Программно изменить стиль ListView селектора

Я делаю дополнение к приложению Windows WPF. Поэтому я могу получить доступ к ListView с помощью программирования, но не могу редактировать источник WPF.

Чтобы добавить специальное форматирование для ListViewItem в зависимости от данных, я создал свой собственный класс StyleSelector и назначил его экземпляр свойству ItemContainerStyleSelector ListView.

Вот источник:

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

Нет эффекта.


person ZoolWay    schedule 12.03.2013    source источник
comment
Можете ли вы просмотреть коллекцию триггеров в своем новом стиле и удалить триггеры наведения и наведения мыши? newStyle.Triggers   -  person Brent Stewart    schedule 12.03.2013
comment
К сожалению, и oldStyle, и newStyle не имеют триггеров. Могут ли они исходить из темы? @БрентСтюарт   -  person ZoolWay    schedule 12.03.2013
comment
Эти эффекты наведения мыши и выбора могут быть определены внутри шаблона элемента (который представляет собой DataTemplate). Сначала вам нужно исследовать и выяснить, где расположены триггеры. Вы можете использовать, например, ILSpy для декомпиляции кода xaml из двоичных файлов.   -  person Woodman    schedule 27.03.2013
comment
Хм, это довольно хороший намек. Я только что проверил. ItemTemplate и ItemTemplateSelector это null. Но Template кое-что понял. Это тоже можно применить?   -  person ZoolWay    schedule 28.03.2013


Ответы (2)


Я бы использовал библиотеку ресурсов и манипулировал триггерами и т. Д. Там.

Начать

Пример:

<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>
person Community    schedule 12.03.2013
comment
К сожалению, я не могу добавить или изменить XAML, но попытался сделать это с помощью программирования, см. обновленный вопрос. Но это не сработало. - person ZoolWay; 12.03.2013
comment
Это может быть очень бесполезный комментарий, если так, я извиняюсь, но вы не можете получить доступ из-за ваших текущих ограничений и проблем? - person ; 27.03.2013
comment
Да, потому что мой код является дополнительным продуктом, и через интерфейсы я получаю список, но не могу изменить скомпилированный XAML. - person ZoolWay; 28.03.2013

Вы можете использовать механизм StyleSelector в WPF.

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

person NthDeveloper    schedule 27.03.2013
comment
Извините, но я уже использую ItemContainerStyleSelector, как сказано в вопросе. Проблема в том, что я могу влиять на стиль обычных строк, но не на зависшие или выбранные строки. - person ZoolWay; 28.03.2013