2010-02-03 4 views
3

J'ai un basé sur un modèle ListBox:ListBox WPF des boutons: comment changer élément sélectionné, cliquez avec XAML

<ListBox Grid.Row="0" Grid.Column="1" Background="Transparent" BorderThickness="0" x:Name="mainMenu" 
    ItemsSource="{Binding Source={x:Static local:MenuConfig.MainMenu}, Mode=OneTime}" 
    IsSynchronizedWithCurrentItem="True"> 
<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
    <EventSetter Event="PreviewMouseUp" Handler="SelectCurrentItem"/> 
    </Style> 
</ListBox.ItemContainerStyle> 
<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
    <StackPanel Orientation="Horizontal"></StackPanel> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
    <Button> 
    <StackPanel> 
    <Image Source="{Binding Icon}" MaxHeight="32" MaxWidth="32"/> 
    <TextBlock Text="{Binding Label}"/> 
    </StackPanel> 
    </Button> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

L'élément sélectionné est mis à jour manuellement avec le code derrière:

private void SelectCurrentItem(object sender, MouseButtonEventArgs e) 
{ 
    ListBoxItem item = (ListBoxItem) sender; 
    item.IsSelected = true; 
} 

Y at-il un façon de le faire (mettre à jour l'élément sélectionné sur le bouton clic) avec XAML seulement?

Répondre

1

style typiquement vous votre DataTemplate regarder et répondre comme un bouton si tel est l'effet que vous voulez par exemple

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Border BorderBrush="Black" BorderThickness="3" CornerRadius="10" Background="#FFD6D3D3" Margin="5"> 
      <Border x:Name="myBorder" BorderBrush="#FFD6D3D3" BorderThickness="4" CornerRadius="10" Padding="2"> 
       <Border.Background> 
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1" > 
         <GradientStop Color="#FFA5A5A5" Offset="1"/> 
         <GradientStop Color="White"/> 
        </LinearGradientBrush> 
       </Border.Background> 
       <StackPanel> 
        <Image Source="{Binding Icon}" MaxHeight="32" MaxWidth="32"/> 
        <TextBlock x:Name="TxtContent" Text="{Binding Label}"/> 
       </StackPanel> 
      </Border> 
     </Border> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True"> 
       <Setter TargetName="myBorder" Property="Background"> 
        <Setter.Value> 
         <LinearGradientBrush StartPoint="0.5,1" EndPoint="0.5,0"> 
          <GradientStop Color="#FFA5A5A5" Offset="1"/> 
          <GradientStop Color="White" /> 
         </LinearGradientBrush> 
        </Setter.Value> 
       </Setter> 
       <Setter TargetName="TxtContent" Property="RenderTransform" > 
        <Setter.Value> 
         <TranslateTransform Y="2.0" /> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

Vous peut également définir la ItemContainerStyle pour remplacer le style par défaut du SelectedItem:

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}" > 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <ContentPresenter /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 
0

A ListBox suit et sélectionne l'élément actuel pour vous, vous n'avez pas besoin de le faire en code. Enlevez ce

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
    <EventSetter Event="PreviewMouseUp" Handler="SelectCurrentItem"/> 
    </Style> 
</ListBox.ItemContainerStyle> 

vous faites un travail qui est fait pour vous hors de la boîte.

1

Le bouton défini dans votre DataTemplate interceptera l'événement click avant que le ListBoxItem ne puisse le gérer. Retirez le ItemContainerStyle et le Button de votre DataTemplate.

<ListBox.ItemTemplate> 
    <DataTemplate> 
    <StackPanel> 
    <Image Source="{Binding Icon}" MaxHeight="32" MaxWidth="32"/> 
    <TextBlock Text="{Binding Label}"/> 
    </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

En effet, le bouton est interceptant le clic, mais je ne veux pas l'enlever, je veux pour garder l'apparence et le toucher du bouton –

Questions connexes