2009-02-10 8 views
15

J'ai une liste déroulante silverlight et je veux supprimer la surbrillance de changement de couleur qui se produit lorsque l'utilisateur sélectionne un élément dans la liste.Silverlight - Arrêter les hautes lumières sur une listbox

Par défaut, lorsqu'un élément est sélectionné, il met en surbrillance l'élément en une sorte de couleur bleu clair.

Comment puis-je empêcher cela de se produire? Comme question secondaire, comment est-ce que je customise ceci à n'importe quelle couleur arbitraire?

Merci.

Répondre

20

Vous pouvez le faire en personnalisant le modèle de contrôle existant pour un élément ListBox. Pour ce faire, lancez simplement Expression Blend, cliquez avec le bouton droit de la souris sur un objet ListBoxItem, sélectionnez Edit Control Parts (Template) et sélectionnez Edit a Copy ... puis personnalisez la couleur de remplissage des rectangles fillColor et fillColor2 selon les besoins.

Le Xaml ci-dessous la couleur ListBoxItem la souris sur d'être transparent et la couleur sélectionnée pour être vert clair, mais vous pouvez personnaliser ceci à vos besoins:

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

Le rectangle fillColor spécifie la couleur à utiliser lorsque l'utilisateur souris-sur un ListBoxItem. Dans le code ci-dessus, j'ai défini ce paramètre pour qu'il soit transparent, donc aucune couleur n'apparaîtra lorsque vous passerez la souris sur le ListBoxItem.

fillColor2 spécifie la couleur à utiliser lorsqu'un objet ListBoxItem est sélectionné. Dans le code ci-dessus j'ai spécifié # FF00FF00 donc la couleur sera vert clair quand un ListBoxItem est sélectionné.

Dans votre situation, vous devez définir la propriété Fill du rectangle fillColor2 sur Transparent pour ne pas simuler de couleur lorsque l'utilisateur sélectionne un élément.

+0

C'est une très bonne réponse, malheureusement, je dois définir le style que je programatically remplir la zone de liste avec toutes sortes d'articles différents. Peut-être que j'ai besoin d'utiliser des données templating hrmm ... – JSmyth

+0

Votre réponse a travaillé avec moi en ajoutant myListItem.Style = (Style) this.Resources ["ListBoxItemStyleTransparent"]; Vous marquerez votre réponse comme la réponse acceptée :) – JSmyth

+1

Oui, c'est ainsi que vous référencez le style par programmation. Si vous utilisez le style sur plusieurs fichiers .xaml, une autre chose à considérer est de le déclarer dans dans App.xaml. Vous pouvez ensuite le référencer via Application.Current.Resources ["ListBoxItemStyleTransparent"]. –

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

"Focusable n'est pas une propriété de ListBoxItem" –

Questions connexes