2013-03-12 14 views
5

Sto facendo un addon a un'applicazione Windows WPF. Pertanto posso accedere a ListView con la programmazione ma non modificare la sorgente WPF.Cambia automaticamente ListView Stile del selettore

Per aggiungere una formattazione speciale per lo ListViewItem s in base ai dati, ho creato la mia classe StyleSelector e ne ho assegnato un'istanza alla proprietà ListView ItemContainerStyleSelector.

Qui è la fonte:

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

Questo prende la vecchia selettore ed aggiunge uno sfondo rosso se indice di colonna 3 contiene un valore pari a "3".

Questo funziona bene ma quando una riga in ListView viene spostata o selezionata, si applica lo stile originale e lo sfondo rosso viene perso finché la riga non è selezionata o scoperta.

Come posso applicare lo sfondo rosso per quelle linee anche quando sono selezionate o al passaggio del mouse?

Ricordare che non è possibile modificare XAML ma accedere in modo programmatico alla maggior parte delle proprietà. Nel caso in cui questo è addon-code scritto in JScript.NET.


Ora ho provato ad aggiungere trigger per newStyle con la programmazione:

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

Nessun effetto.

+0

Riesci a guardare la collezione di trigger sul tuo nuovo stile e rimuovere il passaggio del mouse e librarsi trigger? 'newStyle.Triggers' –

+0

Sfortunatamente oldStyle e newStyle non hanno alcun trigger. Possono venire da un tema? @BrentStewart – ZoolWay

+0

Questi effetti del passaggio del mouse e di selezione del mouse potrebbero essere definiti all'interno del modello di elemento (che è DataTemplate). Prima è necessario indagare e scoprire dove si trovano i trigger. Puoi usare, ad esempio, ILSpy, per decompilare il codice xaml dai binari – Woodman

risposta

3

Vorrei utilizzare una libreria di risorse e manipolare i trigger ecc.

Get Started

Esempio:

<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

Purtroppo non posso aggiungere o modificare XAML ma ho provato a farlo con la programmazione, vedere la domanda aggiornata. Ma non ha funzionato. – ZoolWay

+0

Questo forse è un commento molto scortese se così mi scuso, ma non riesci ad accedere a causa dei tuoi attuali limiti e problemi? –

+0

Sì perché il mio codice è un prodotto "addon" e attraverso le interfacce ottengo l'elenco ma non posso modificare lo XAML compilato. – ZoolWay

Problemi correlati