2009-02-10 7 views
15

Ich habe eine Silverlight-Listbox und möchte die Farbwechsel-Hervorhebung entfernen, die auftritt, wenn der Benutzer ein Element in der Listbox auswählt.Silverlight - Stoppen von Hervorhebungen in einer Listbox

Wenn ein Element ausgewählt ist, wird standardmäßig das Element hellblau hervorgehoben.

Wie kann ich dies verhindern?

Als eine Nebenfrage, wie kann ich dies zu jeder beliebigen Farbe anpassen?

Danke.

Antwort

20

Sie können dies tun, indem Sie die vorhandene Steuerelementvorlage für ein ListBox-Element anpassen. Der einfachste Weg dazu besteht darin, Expression Blend zu starten, mit der rechten Maustaste auf ein ListBoxItem zu klicken, zu Control Parts (Template) bearbeiten und Copy bearbeiten ... auszuwählen und dann die Füllfarbe der fillColor- und fillColor2-Rechtecke nach Bedarf anzupassen.

XAML unten stellt die ListBoxItem mouse-over Farbe transparent zu sein, und die ausgewählte Farbe hell grün sein, aber Sie können diese an Ihre Bedürfnisse anpassen:

<UserControl x:Class="SilverlightApplication2.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows" 
    Width="400" Height="300" Background="#FF000000"> 
    <UserControl.Resources> 
    <Style x:Key="ListBoxItemStyleTransparent" TargetType="ListBoxItem"> 
     <Setter Property="Padding" Value="3"/> 
     <Setter Property="HorizontalContentAlignment" Value="Left"/> 
     <Setter Property="VerticalContentAlignment" Value="Top"/> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="TabNavigation" Value="Local"/> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ListBoxItem"> 
      <Grid Background="{TemplateBinding Background}"> 
       <vsm:VisualStateManager.VisualStateGroups> 
       <vsm:VisualStateGroup x:Name="CommonStates"> 
        <vsm:VisualState x:Name="Normal"/> 
        <vsm:VisualState x:Name="MouseOver"> 
        <Storyboard> 
         <DoubleAnimationUsingKeyFrames Storyboard.TargetName="fillColor" Storyboard.TargetProperty="Opacity"> 
         <SplineDoubleKeyFrame KeyTime="0" Value=".35"/> 
         </DoubleAnimationUsingKeyFrames> 
        </Storyboard> 
        </vsm:VisualState> 
        <vsm:VisualState x:Name="Disabled"> 
        <Storyboard> 
         <DoubleAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Opacity"> 
         <SplineDoubleKeyFrame KeyTime="0" Value=".55"/> 
         </DoubleAnimationUsingKeyFrames> 
        </Storyboard> 
        </vsm:VisualState> 
       </vsm:VisualStateGroup> 
       <vsm:VisualStateGroup x:Name="SelectionStates"> 
        <vsm:VisualState x:Name="Unselected"/> 
        <vsm:VisualState x:Name="Selected"> 
        <Storyboard> 
         <DoubleAnimationUsingKeyFrames Storyboard.TargetName="fillColor2" Storyboard.TargetProperty="Opacity"> 
         <SplineDoubleKeyFrame KeyTime="0" Value=".75"/> 
         </DoubleAnimationUsingKeyFrames> 
        </Storyboard> 
        </vsm:VisualState> 
       </vsm:VisualStateGroup> 
       <vsm:VisualStateGroup x:Name="FocusStates"> 
        <vsm:VisualState x:Name="Focused"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Visibility"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
          <Visibility>Visible</Visibility> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
        </vsm:VisualState> 
        <vsm:VisualState x:Name="Unfocused"/> 
       </vsm:VisualStateGroup> 
       </vsm:VisualStateManager.VisualStateGroups> 
       <Rectangle x:Name="fillColor" IsHitTestVisible="False" Opacity="0" RadiusX="1" RadiusY="1" Fill="Transparent"/> 
       <Rectangle x:Name="fillColor2" IsHitTestVisible="False" Opacity="0" Fill="#FF00FF00" RadiusX="1" RadiusY="1"/> 
       <ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="contentPresenter" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> 
       <Rectangle x:Name="FocusVisualElement" Visibility="Collapsed" Stroke="#FF6DBDD1" StrokeThickness="1" RadiusX="1" RadiusY="1"/> 
      </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </UserControl.Resources> 
    <Grid x:Name="LayoutRoot" Background="White"> 
    <ListBox x:Name="ListBoxTest"> 
     <ListBoxItem Content="Some String" Style="{StaticResource ListBoxItemStyleTransparent}" /> 
    </ListBox> 
    </Grid> 
</UserControl> 

Die fillColor Rechteck gibt die Farbe zu verwenden, wenn der Benutzer mouses-über ein ListBoxItem. In dem obigen Code habe ich dies auf Transparent gesetzt, so dass keine Farbe angezeigt wird, wenn Sie die Maus über das ListBoxItem bewegen.

Die Füllfarbe2 gibt die Farbe an, die verwendet werden soll, wenn ein ListBoxItem ausgewählt ist. Im obigen Code habe ich # FF00FF00 angegeben, so dass die Farbe hellgrün ist, wenn ein ListBoxItem ausgewählt ist.

In Ihrer Situation würden Sie die Fill-Eigenschaft des Rechtecks ​​FillColor2 auf Transparent setzen, um keine Farbe zu simulieren, wenn der Benutzer ein Element auswählt.

+0

Dies ist eine sehr gute Antwort, leider muß ich den Stil programmatisch setzen, wie ich das Listenfeld mit allen Arten von verschiedenen Artikeln zu füllen. Vielleicht muss ich einige Daten Templating verwenden ... – JSmyth

+0

Ihre Antwort arbeitete mit mir myListItem.Style = (Style) this.Resources ["ListBoxItemStyleTransparent"]; Wird Ihre Antwort als die akzeptierte Antwort markieren :) – JSmyth

+1

Ja, das ist, wie Sie den Style programmatisch referenzieren. Wenn Sie den Style für mehrere .xaml-Dateien verwenden, müssen Sie ihn in in App.xaml deklarieren. Sie können dann über Application.Current.Resources ["ListBoxItemStyleTransparent"] darauf verweisen. –

-1
<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Focusable" Value="false"></Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 
+2

"Fokusierbar ist keine Eigenschaft von ListBoxItem" –