2008-12-10 8 views
8

J'ai un ListBox qui fait défiler les images horizontalement.WPF Xaml Custom Style Style d'élément sélectionné dans un ListBox

J'ai le mélange XAML suivant que j'ai utilisé pour le créer. Il avait à l'origine un x: Key sur la ligne Style TaregetType, MSDN a dit de le supprimer, car je recevais des erreurs sur ce point. Maintenant, je reçois cette erreur:

Error 3 Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.

Je ne comprends pas comment appliquer tous cette ordure de cette façon, je l'ai essayé plusieurs choses, rien ne fonctionne.

Mon objectif est que l'arrière-plan de l'élément sélectionné soit blanc et non bleu. On dirait beaucoup de travail pour quelque chose de si petit!

Merci.

<ListBox ItemsSource="{Binding Source={StaticResource WPFApparelCollection}}" 
     Grid.Row="1" Margin="2,26,2,104" ScrollViewer.VerticalScrollBarVisibility="Hidden" 
      ScrollViewer.HorizontalScrollBarVisibility="Hidden" SelectionMode="Single" 
     x:Name="list1" MouseLeave="List1_MouseLeave" MouseMove="List1_MouseMove" Style="{DynamicResource ListBoxStyle1}" > 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="Background" Value="Transparent"/> 
      <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
      <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
      <Setter Property="Padding" Value="2,0,0,0"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> 
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="true"> 
           <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
           <Setter Property="Background" TargetName="Bd" Value="#FFFFFFFF"/> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsSelected" Value="true"/> 
            <Condition Property="Selector.IsSelectionActive" Value="false"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
           <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
          </MultiTrigger> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel 
      Orientation="Horizontal" 
      IsItemsHost="True" /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Image Source="{Binding Image}" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Répondre

13

Enveloppez la balise de style avec un ItemContainerStyle comme ci-dessous:

<ListBox ItemsSource="{Binding Source={StaticResource WPFApparelCollection}}" 
     Grid.Row="1" Margin="2,26,2,104" 
     ScrollViewer.VerticalScrollBarVisibility="Hidden" 
     ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
     SelectionMode="Single" 
     x:Name="list1" MouseLeave="List1_MouseLeave" MouseMove="List1_MouseMove" 
     Style="{DynamicResource ListBoxStyle1}" > 

     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Background" Value="Transparent"/> 
      </Style> 
<!-- the rest of your code, but close the ItemContainerStyle --> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 
2

J'ai essayé la solution ci-dessus, mais il n'a pas fonctionné comme prévu donc j'ai trouvé une autre façon de résoudre mon problème est de désactiver la sélection pour listbox

ce que je l'ai fait

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Focusable" Value="False"/> 
    </Style> 
</ListBox.ItemContainerStyle>