2013-03-12 16 views
5

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.

+0

można spojrzeć kolekcji wyzwalaczy na nowego stylu i wyjąć mouseover i unoszą wyzwalacze? 'newStyle.Triggers' –

+0

Niestety oldStyle i newStyle nie mają żadnych wyzwalaczy. Czy mogą pochodzić z tematu? @BrentStewart – ZoolWay

+0

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

Odpowiedz

3

Chciałbym użyć biblioteki zasobów i manipulować wyzwalacze itp. Tam.

Get Started

Przykład:

<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> 
+0

Niestety nie mogę dodawać ani modyfikować XAML, ale próbowałem to zrobić z programowaniem, zobacz zaktualizowane pytanie. Ale to nie zadziałało. – ZoolWay

+0

To może bardzo nieprzydatny komentarz, więc przepraszam, ale czy nie możesz uzyskać dostępu z powodu obecnych ograniczeń i problemu? –

+0

Tak, ponieważ mój kod jest produktem "dodatkowym" i poprzez interfejsy otrzymuję listę, ale nie mogę zmienić skompilowanego XAML. – ZoolWay

Powiązane problemy