2010-06-23 4 views
2

J'ai un ListBox qui est une cible de baisse d'éléments provenant d'autres sources.WPF ListBox vide comme cible

Tout fonctionne correctement, sauf dans une situation particulière. Lorsque le ListBox n'a pas d'éléments, je ne peux que laisser tomber dans la frontière de ListBox (j'ai un déclencheur de sorte que la bordure est visible lorsque vous faites glisser).

Pour donner une plus grande zone de dépôt que je mets la MinHeight du ListBox à 25. Lors du déplacement, la frontière reflète la MinHeight du ListBox, mais la zone est pas considérée comme une cible. Ce qui se passe probablement, c'est que la cible est considérée comme étant l'arrière-plan car il n'y a pas d'élément dans le ListBox.

Voici le code pour le ListBox:

<ListBox Name="itmCtrlSetupSteps" Grid.Row="1" MinHeight="25" 
     BorderThickness="2" BorderBrush="{Binding DropBrush}" Background="Transparent" 
     ItemsSource="{Binding SetupSteps}" SelectionMode="Single" ItemContainerStyle="{StaticResource StepItemStyle}" 
     HorizontalContentAlignment="Stretch" Focusable="True" 
     SelectionChanged="manageStep_SelectionChanged" 
     AllowDrop="True" DragOver="itmCtrls_DragOver" Drop="itmCtrls_Drop" KeyUp="List_KeyUp" 
     > 
    <ListBox.Template> 
     <ControlTemplate TargetType="ListBox"> 
      <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> 
       <ItemsPresenter/> 
      </Border> 
     </ControlTemplate> 
    </ListBox.Template> 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type my:TestStepListingStepViewModel}"> 
      <my:TestStepListingStepView HorizontalAlignment="Stretch" GotFocus="setupSteps_GotFocus" MouseDoubleClick="Step_MouseDoubleClick"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Si je mets le ItemPanel à:

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Grid ClipToBounds="True"/> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 

je peux déposer des éléments dans le ListBox vide mais les éléments sont présentés au-dessus de l'autre, au lieu d'une liste. Vous avez des commentaires à ce sujet?

Répondre

2

Le problème est que votre ListBox n'apparaît pas lorsqu'il est testé. Vous devez définir le pinceau d'arrière-plan sur la bordure dans le modèle de contrôle afin qu'il reflète votre paramètre de transparent sur le contrôle ListBox. Dans le cas où quelqu'un

<ControlTemplate TargetType="ListBox"> 
    <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" > 
      <ItemsPresenter/> 
    </Border> 
</ControlTemplate> 
+0

Merci pour l'aide! – jpsstavares

3

est d'avoir ce problème avec un autre contrôle, juste l'entourer d'une bordure, définissez l'arrière-plan à une couleur, et ajouter les événements glisser/déposer à la frontière avec jeu AllowDrop pour être vrai .