2012-03-03 10 views
10

Mam Listbox z plikami, chcę móc prawym przyciskiem myszy i otworzyć menu, takie jak Usuń, aby usunąć pliki z Listbox.jak kliknąć prawym przyciskiem myszy na pozycji z Listbox i otworzyć menu na WPF

Obecnie mam tej funkcji po kliknięciu prawym przyciskiem myszy na pozycji wewnątrz mojego Listbox

private void listBoxFiles_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 

} 

i wdrożyć w XAML menu Usuń po prawej kliknij

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

wyboru funkcji, które usunąć plik z mojego pola listy:

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); 
} 

Odpowiedz

1

nie trzeba listBoxFiles_PreviewMouseRightButtonDown kiedy pisał

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

to już działa po prawej kliknij

+0

dzięki, postaram to w godzinach wieczornych i aktualizacji. – user979033

+0

OK, dzięki, jak mogę "złapać" nazwę pliku (ścieżki), którą kliknąłem? – user979033

+0

Chcę dodać 3 funkcje w menu (każda opcja w menu będzie miała inną funkcję), więc nadal konieczne jest sprawdzenie, który element został kliknięty? i nie rozumiem ostatnich 2 linii w funkcji s MenuItemDelete_Click – user979033

27

Masz już menu kontekstowe ze znaczników.

Jeśli chcesz wykonać jakąś operację, jednym ze sposobów jest sprawdzenie, który element został kliknięty w funkcji Click menu. Na przykład, masz następnego listbox:

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

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

</ListBox> 

i funkcja może być następny:

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); 
} 

Updated 5 marca 2012:

Oto kolejny wariant swojego listbox. Możesz dodać menu kontekstowe nie do listbox, ale do elementów listbox. Na przykład:

<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) Funkcja ta unsellect wszystkie przedmioty po kliknięciu na pustej przestrzeni w polu listy:

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

2) Po kliknięciu elementu lisboxt jest niebieski. Kiedy klikniesz prawym przyciskiem myszy element listy, pozostanie on niebieski, ale jeśli pojawi się menu kontekstowe, element listbox staje się szary, może dlatego, że ten przedmiot traci fokus.

3) funkcji Delete działa dobrze:

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

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

dzięki, spróbuję tego wieczorem i zaktualizuję. – user979033

+0

Chcę dodać 3 funkcje w menu, więc nadal trzeba sprawdzić, który element został kliknięty? i nie zrozumiałem ostatnich 2 linii w funkcji MenuItemDelete_Click – user979033

+0

Chcę dodać 3 funkcje w menu (każda opcja w menu będzie miała inną funkcję), więc nadal konieczne jest sprawdzenie, który element został kliknięty? i nie rozumiem ostatnich 2 linii w funkcji s MenuItemDelete_Click – user979033

Powiązane problemy