2013-02-12 9 views
12

Ich versuche, die E-Mail-Benutzeroberfläche von Windows 8 in einer WPF-Anwendung auf Windows 7. Hier läuft neu, was ich erreichen möchte:So legen Sie eine WPF ListView-Objektfarbe fest?

Target UI

Insbesondere, ich weiß nicht, wie das ändern Hintergrundfarbe für ausgewählte Artikel, z der Posteingang in der ersten Spalte und die Post von Twitter in der zweiten Spalte. Ich habe mehrere Lösungen aus anderen ähnlichen Stackoverflow-Fragen ausprobiert, aber keine scheint für mich zu funktionieren. z.B.

Selected item loses style when focus moved out in WPF ListBox

WPF ListView Inactive Selection Color

Hier ist der Code, den ich für meine Listview haben:

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

Wie kann ich die Hintergrundfarbe des ausgewählten Elements ändern? Und wie behalte ich die Farbänderung, wenn sich der Fokus ändert.

Antwort

14

habe ich etwas Ähnliches wie dies vor kurzem:

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

Ich glaube, zu entfernen:

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

ermöglicht es Ihnen, die Hintergrundfarbe zu halten, nachdem Fokus verloren.

EDIT:

Als Antwort auf Ihre Frage unter:

Sie können die Tag-Eigenschaft des Textblock auf den Befehl Parameter binden, und führen Sie dann den Befehl auf dem MouseUp-Ereignis des Textblock:

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

Und in der Code-behind:

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

Dank @TrueEddie. Meine Maschine agiert und ich kann Ihre Lösung nicht testen. Ich werde zurückkommen, sobald ich meine Maschine reparieren kann. – Yasir

+0

Dies zeigt die Auswahl richtig an. Aber jetzt, da wir TextBlock anstelle des Hyperlinks verwenden, den ich verwendet habe, kann ich den Befehl, den ich aufrufen musste, nicht mehr liefern. Wie kann ich den Befehl und die zugehörigen Parameter angeben? Wenn ich Ihr Border-Element durch einen Hyperlink ersetze, kann ich die Farbe ändern, wenn außerhalb des Hyperlinks geklickt wird, aber ich kann den Befehl nicht aufrufen. Wenn ich auf den Hyperlink klicke, kann ich den Befehl einfügen, aber die Farbe wird nicht geändert. – Yasir

+0

Ich habe meine Antwort oben bearbeitet. – TrueEddie

7

Hinzufügen zu "TrueEddie" Punkt.

Die andere Option wäre "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 in Style.xml definiert

<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 mehr Details

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

+4

Ich glaube, dass Ihre ** ItemContainerStyle ** und ** ItemTemplate ** Bindings vertauscht sind und 'ItemContainerStyle =" {StaticResource ListViewItemOptionStyle} "' lesen sollten, sonst erhalten Sie eine Konvertierung Ausnahme. Auch könnte es nur ich sein, würde ich '' über die Verwendung von 'empfehlen, wenn mehrere Spalten beteiligt sind. – famousKaneis

Verwandte Themen