2010-08-03 9 views
4

Nous voulons sélectionner une ligne sur un clic de souris n'importe où dans cette rangée. Actuellement, l'utilisateur doit cliquer sur le texte de la ligne pour sélectionner la ligne.Obtenir un GridView pour sélectionner la ligne à cliquer (pas simplement cliquer sur le texte)

Ceci est notre ListView à l'intérieur d'une grille, avec un GridView intérieur:

<ListView Grid.Row="1" 
      x:Name="lvUsers" 
      PreviewMouseDoubleClick="lvUsers_PreviewMouseDoubleClick" 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding AllUsers,Mode=TwoWay}" 
      ScrollViewer.VerticalScrollBarVisibility="Auto" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Username" 
           Width="150" 
           DisplayMemberBinding="{Binding UserDTO.Name}" /> 
       <GridViewColumn Header="Fullname" 
           Width="150" 
           DisplayMemberBinding="{Binding UserDTO.FullName}" /> 
       <GridViewColumn Header="Roles" 
           Width="250" 
           DisplayMemberBinding="{Binding Roles}" /> 
       <GridViewColumn Header="Default station" 
           Width="200" DisplayMemberBinding="{Binding UserDTO.DefaultStation.StationName}"/> 
      </GridView> 
     </ListView.View> 
    </ListView> 

Comment pouvons-nous l'obtenir pour sélectionner la ligne lorsque l'utilisateur clique ne importe où dans la ligne (même sur l'espace vide entre dire le nom complet et les rôles)?

Merci!

+0

Avez-vous trouvé une solution? – Cilvic

+0

Désolé, je n'ai pas. Notre produit a toujours ce "bug". – Tomas

Répondre

3

Je suppose que vous n'obtenez pas de réponse parce que personne ne peut reproduire le problème. Avec juste le code que vous avez fourni, vous pouvez cliquer n'importe où dans la grille et l'élément sera sélectionné.

Je suppose que quelqu'un de votre équipe a modélisé le ListViewItem dans un style que vous pouvez ou ne pas connaître. Si vous modèlez ListViewItem, vous pouvez voir le problème dont vous parlez.

Si vous exécutez le code ci-dessous vous verrez le problème:

<Grid> 
     <ListView Grid.Row="1" 
      x:Name="lvUsers" 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding AllUsers,Mode=TwoWay}" 
      ScrollViewer.VerticalScrollBarVisibility="Auto" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" > 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="ListViewItem"> 
           <Grid> 
            <Rectangle x:Name="ItemBackground" Fill="{x:Null}"/> 
            <GridViewRowPresenter/> 
           </Grid> 
           <ControlTemplate.Triggers> 
            <Trigger Property="IsMouseOver" Value="True"> 
             <Setter TargetName="ItemBackground" Property="Fill" Value="LightGray" /> 
            </Trigger> 
            <Trigger Property="IsSelected" Value="True"> 
             <Setter TargetName="ItemBackground" Property="Fill" Value="Gray" /> 
             <Setter TargetName="ItemBackground" Property="StrokeDashArray" Value="1 1 1"/> 
             <Setter TargetName="ItemBackground" Property="Stroke" Value="DarkGray"/> 
             <Setter TargetName="ItemBackground" Property="StrokeThickness" Value="1"/> 
             <Setter TargetName="ItemBackground" Property="RenderOptions.EdgeMode" Value="Aliased"/> 
            </Trigger> 
           </ControlTemplate.Triggers> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ListView.ItemContainerStyle> 
      <ListView.Items> 
       <ListViewItem Content="Test Item 1"></ListViewItem> 
       <ListViewItem Content="Test Item 2"></ListViewItem> 
       <ListViewItem Content="Test Item 3"></ListViewItem> 
       <ListViewItem Content="Test Item 4"></ListViewItem> 
      </ListView.Items> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Width="150" DisplayMemberBinding="{Binding}"/> 
        <GridViewColumn Width="150" DisplayMemberBinding="{Binding}"/> 
        <GridViewColumn Width="150" DisplayMemberBinding="{Binding}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 

Dans ce cas, en cliquant dans l'espace blanc présente le comportement de problème. Cela ne déclenche pas la sélection de l'élément de liste.

La solution est d'ajouter un rectangle avec transparence 0 sur l'ensemble du modèle d'élément, comme ceci:

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ListViewItem"> 
      <Grid> 
       <Rectangle x:Name="ItemBackground" Fill="{x:Null}"/> 
       <GridViewRowPresenter/> 
       **<Rectangle Fill="White" Opacity="0"></Rectangle>** 
      </Grid> 
     <etc...> 

maintenant les travaux de clic, et le vol stationnaire ainsi.

J'espère que cela aide. Ça nous rendait dingue aussi jusqu'à ce qu'on y pense.

0

Addendum à la réponse de Nigel Shaws, qui a conduit à une réponse à cette question pour moi.

Vous n'avez pas besoin de mettre le Rectangle sur l'ensemble de Template. Cela bloquera tous les contrôles que vous pourriez avoir dans votre rangée. Au lieu de cela, vous pouvez simplement utiliser un Rectangle derrière votre GridViewRowPresenter. Assurez-vous que la propriété Fill du Rectangle est définie.

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ListViewItem"> 
      <Grid> 
       <Rectangle x:Name="ItemBackground" Fill="White" Opacity="0"/> 
       <GridViewRowPresenter/> 
      </Grid> 
     <etc...> 
Questions connexes