2013-02-12 24 views
12

Sto cercando di ricreare l'interfaccia utente posta da Windows 8 in un'applicazione WPF in esecuzione su Windows 7. Ecco quello che voglio raggiungere:Come impostare un colore dell'elemento selezionato ListView WPF?

Target UI

In particolare, non so come cambiare il colore di sfondo per gli articoli selezionati es la posta in arrivo nella prima colonna e la posta da Twitter nella seconda colonna. Ho provato diverse soluzioni da altre simili Stackoverflow Questions ma nessuna sembra funzionare per me. per esempio.

Selected item loses style when focus moved out in WPF ListBox

WPF ListView Inactive Selection Color

Ecco il codice che ho per il mio ListView:

<ListView Grid.Row="0" SelectedItem="{Binding Path=SelectedArea}" ItemsSource="{Binding Path=Areas}" Background="#DCE3E5" > 

        <ListView.Resources> 

         <!-- Template that is used upon selection of an Area --> 
         <ControlTemplate x:Key="SelectedTemplate" TargetType="ListViewItem"> 
          <Border Background="#388095" Cursor="Hand" > 
           <TextBlock Text="{Binding Name}" Margin="5" /> 
          </Border>         
         </ControlTemplate> 

         <Style TargetType="ListViewItem"> 
          <Setter Property="Template"> 
           <Setter.Value>           
            <!-- Base Template that is replaced upon selection --> 
            <ControlTemplate TargetType="ListViewItem"> 
             <Border Background="#DCE3E5" Cursor="Hand" > 
              <TextBlock Text="{Binding Name}" Margin="5" /> 
             </Border> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
          <Style.Triggers> 
           <MultiTrigger> 
            <MultiTrigger.Conditions> 
             <Condition Property="IsSelected" Value="true" /> 
            </MultiTrigger.Conditions> 
            <Setter Property="Template" Value="{StaticResource SelectedTemplate}" /> 
           </MultiTrigger> 
          </Style.Triggers> 
         </Style> 

        </ListView.Resources>       

       </ListView> 

Come posso cambiare il colore della voce selezionata di sottofondo? E come posso mantenere il cambio di colore quando cambia lo stato attivo.

risposta

14

Ho fatto qualcosa di simile a questo di recente:

<ListView.Resources>     
    <ControlTemplate x:Key="SelectedTemplate" TargetType="ListViewItem"> 
     <Border CornerRadius="5" BorderThickness="1" BorderBrush="DarkGray" Background="#FF92C6F9" Padding="2" HorizontalAlignment="Left" Margin="5" Tag="{Binding Value}" Cursor="Hand" MouseUp="Border_MouseUp_1">       
      <TextBlock Text="{Binding Name}" Margin="5" /> 
     </Border> 
    </ControlTemplate> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ListViewItem"> 
        <Border CornerRadius="5" BorderThickness="1" BorderBrush="DarkGray" Background="WhiteSmoke" Padding="2" HorizontalAlignment="Left" Margin="5" Tag="{Binding Value}" Cursor="Hand" MouseUp="Border_MouseUp_1" >          
         <TextBlock Text="{Binding Name}" Margin="5" /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <MultiTrigger> 
       <MultiTrigger.Conditions> 
        <Condition Property="IsSelected" Value="true" /> 
        <Condition Property="Selector.IsSelectionActive" Value="true" /> 
       </MultiTrigger.Conditions>        
       <Setter Property="Template" Value="{StaticResource SelectedTemplate}" />        
      </MultiTrigger> 
     </Style.Triggers> 
    </Style> 
</ListView.Resources> 

Credo che la rimozione:

<Condition Property="Selector.IsSelectionActive" Value="true" /> 

vi permetterà di mantenere il colore di sfondo di messa a fuoco dopo si perde.

EDIT:

In risposta alla tua domanda di seguito:

È possibile associare la proprietà tag del TextBlock al parametro di comando e quindi eseguire il comando sul evento MouseUp del TextBlock:

<TextBlock x:Name="MyTextBlock" Text="Click Me!" Tag="{Binding MyCommandParameter}" MouseUp="MyTextBlock_MouseUp" /> 

E nel codice dietro:

private void MyTextBlock_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     TextBlock tb = sender as TextBlock; 

     if (tb != null && tb.Tag != null) 
     { 
      ViewModel.MyCommand.Execute(tb.Tag); 
     }    
    } 
+0

Grazie @TrueEddie. La mia macchina sta agendo e non sono in grado di testare la tua soluzione. Tornerò non appena sarò in grado di aggiustare la mia macchina. – Yasir

+0

Questo mostra la selezione correttamente. Ma ora che stiamo usando TextBlock invece del collegamento ipertestuale che stavo usando, non sono più in grado di fornire il comando che dovevo invocare. Come posso fornire il comando e il parametro associato? Quando sostituisco il tuo elemento Border con il collegamento ipertestuale, mi consente di cambiare colore quando si fa clic all'esterno del collegamento ipertestuale, ma non mi consente di richiamare il comando. Quando faccio clic sul collegamento ipertestuale, mi consente di inovke il comando ma il colore non viene modificato. – Yasir

+0

Ho modificato la mia risposta sopra. – TrueEddie

7

Basta aggiungere al punto "TrueEddie".

L'altra opzione sarebbe "ItemContainerStyle" in ListView.

<ListView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 


        BorderThickness="0" 
        ItemContainerStyle="{StaticResource ListViewSmartNotes}" 
        SelectedItem="{Binding SelectedSmartNotes, Mode=TwoWay}" 
        ItemsSource="{Binding LstSmartNotes, Mode=TwoWay}" 
        ItemTemplate="{DynamicResource ListViewItemOptionStyle}"> 


     </ListView> 

ListViewItemOptionStyle definito Style.xml

<Style x:Key="ListViewItemOptionStyle" TargetType="ListViewItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <!-- Trun off default selection--> 
       <ControlTemplate TargetType="{x:Type ListViewItem}"> 
        <Border x:Name="Bd" BorderBrush="Gray" BorderThickness="0,1,0,1" 
          Background="{TemplateBinding Background}" 
          Padding="{TemplateBinding Padding}" 
          SnapsToDevicePixels="true"> 
         <ContentPresenter 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" 
            Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    <Style.Triggers> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsSelected" Value="True" /> 
      </MultiTrigger.Conditions> 
      <MultiTrigger.Setters> 
       <Setter Property="Background" Value="Green" /> 
       <Setter Property="BorderBrush" Value="Green" /> 
       <Setter Property="Foreground" Value="White"/> 
      </MultiTrigger.Setters> 
     </MultiTrigger> 
    </Style.Triggers> 
</Style> 

Fore maggiori dettagli

https://sites.google.com/site/greateindiaclub/mobil-apps/windows8/wpfimportantbindings

+4

Credo che i tuoi binding di ItemContainerStyle ** e ** ItemTemplate ** siano invertiti e dovresti leggere 'ItemContainerStyle =" {StaticResource ListViewItemOptionStyle} "', altrimenti otterrai una conversione eccezione. Inoltre, potrebbe essere solo io, raccomanderei l'uso di '' utilizzando '', se sono coinvolte più colonne. – famousKaneis

Problemi correlati