2012-03-03 14 views
10

ho Listbox con file in, voglio poter fare clic destro e aprire un menu come Elimina per rimuovere i file dalla Listbox.come fare clic destro sulla voce da Listbox e aprire il menu su WPF

Attualmente ho questa funzione dopo tasto destro del mouse sulla voce dentro la mia casella di riepilogo

private void listBoxFiles_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 

} 

e attuare, a XAML menu Cancella dopo fare clic destro

  <ListBox.ContextMenu> 
       <ContextMenu>               
        <MenuItem Header="Delete"/> 
       </ContextMenu> 
      </ListBox.ContextMenu> 

la funzione che cancellare il file dal mio ListBox:

private void MenuItemDelete_Click(object sender, RoutedEventArgs e) 
{    
    if (listBoxFiles.SelectedIndex == -1) 
    { 
     return; 
    } 

    //string filePath = (listBoxFiles.SelectedItem).ToString(); 
    int index = listBoxFiles.SelectedIndex; 
    listBoxFiles.Items.RemoveAt(index); 
} 

risposta

1

non necessario listBoxFiles_PreviewMouseRightButtonDown quando hai scritto

<ListBox> 
      <ListBox.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Delete"></MenuItem> 
       </ContextMenu> 
      </ListBox.ContextMenu> 
     </ListBox> 

si sta già lavorando dopo fare clic destro

+0

grazie, cercherò questo alla sera e di aggiornamento. – user979033

+0

OK grazie, ora come posso "catturare" il nome del file (percorso) su cui ho fatto clic? – user979033

+0

voglio aggiungere 3 funzioni nel menu (ogni opzione nel menu avrà una funzione diversa) quindi è ancora necessario controllare quale elemento è stato cliccato? e non ho capito le ultime 2 righe nella funzione s MenuItemDelete_Click – user979033

27

Hai già un menu contestuale con il vostro codice.

Se si desidera eseguire un'operazione, uno dei modi è controllare quale elemento è stato fatto clic nella funzione Click del menu. Ad esempio, si ha la seguente casella di riepilogo:

<ListBox Name="someListBox"> 
    <ListBox.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Delete" Click="MenuItemDelete_Click"/> 
     </ContextMenu> 
    </ListBox.ContextMenu> 

    <ListBoxItem>...</ListBoxItem> 
    <ListBoxItem>...</ListBoxItem> 
    <ListBoxItem>...</ListBoxItem> 

</ListBox> 

E funzione potrebbe essere il prossimo:

private void MenuItemDelete_Click(object sender, RoutedEventArgs e) 
{ 
    if (someListBox.SelectedIndex == -1) return; 

    // Hypothetical function GetElement retrieves some element 
    var element = GetElement(someListBox.SelectedIndex); 

    // Hypothetical function DeleteElement 
    DeleteElement(element); 
} 

Aggiornato 5 Marzo 2012:

Ecco un'altra variante della vostra casella di riepilogo. È possibile aggiungere un menu di scelta rapida non alla casella di riepilogo ma agli elementi della casella di riepilogo. Per esempio:

<ListBox Name="someListBox" MouseDown="someListBox_MouseDown"> 
    <ListBox.Resources> 

     <!--Defines a context menu--> 
     <ContextMenu x:Key="MyElementMenu"> 
      <MenuItem Header="Delete" Click="MenuItemDelete_Click"/> 
     </ContextMenu> 

     <!--Sets a context menu for each ListBoxItem in the current ListBox--> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/> 
     </Style> 

    </ListBox.Resources> 
    <ListBoxItem>...</ListBoxItem> 
    <ListBoxItem>...</ListBoxItem> 
    <ListBoxItem>...</ListBoxItem> 
</ListBox> 

1) Questa funzione unsellect tutti gli elementi quando si fa clic su uno spazio vuoto nella casella di riepilogo:

private void someListBox_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    someListBox.UnselectAll(); 
} 

2) Quando si sceglie la voce lisboxt, è blu. Quando fai clic con il pulsante destro del mouse sull'elemento casella di riepilogo, è ancora blu, ma se viene visualizzato un menu di scelta rapida, l'elemento della casella di riepilogo diventa grigio, forse è così perché questo elemento perde il focus.

3) la funzione Cancella funziona bene:

private void MenuItemDelete_Click(object sender, RoutedEventArgs e) 
{ 
    if (someListBox.SelectedIndex == -1) 
    { 
     return; 
    } 

    someListBox.Items.RemoveAt(someListBox.SelectedIndex); 
} 
+0

grazie, proverò questo alla sera e aggiornerò. – user979033

+0

voglio aggiungere 3 funzioni nel menu, quindi è ancora necessario controllare quale elemento è stato cliccato? e non ho capito le ultime 2 righe nella funzione s MenuItemDelete_Click – user979033

+0

voglio aggiungere 3 funzioni nel menu (ogni opzione nel menu avrà una funzione diversa) quindi è ancora necessario controllare quale elemento è stato cliccato? e non ho capito le ultime 2 righe nella funzione s MenuItemDelete_Click – user979033

Problemi correlati