2010-11-19 4 views
1

Ich finde eine Lösung, wie Listbox Element auf die rechte Maustaste klicken, aber keine Lösung funktioniert nicht, nachdem ich Listbox scrollen. Ist es möglich Listbox auf rechte Maustaste zu wählen, wenn ich auch Listbox scrolle? Irgendein Fortschritt?WPF Select Listbox Element auf der rechten Maustaste nach dem Scrollen Listenfeld

Mein Code ist hier:

<ListBox Name="friendsListBox" 
     ItemsSource="{Binding}" 
     SelectedItem="Key" 
     Style="{DynamicResource friendsListStyle}" 
     PreviewMouseRightButtonUp="ListBox_PreviewMouseRightButtonUp" 
     PreviewMouseRightButtonDown="ListBox_PreviewMouseRightButtonDown" 
     Grid.Row="1" MouseRightButtonDown="FriendsListBoxMouseRightButtonDown"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ContextMenu> 
     <ContextMenu x:Name="FriendContextMenu"> 
      <MenuItem Name="SendRp" Header="Pošli Rp" Click="FriendContextMenuItem_Click" /> 
      <MenuItem Name="SendMsg" Header="Pošli poštu" Click="FriendContextMenuItem_Click"/> 
      <MenuItem Name="DeleteFriend" Header="Vymaž" Click="FriendContextMenuItem_Click"/> 
     </ContextMenu> 
    </ListBox.ContextMenu> 
</ListBox> 

-Code hinter:

private void ListBox_PreviewMouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    SelectItemOnRightClick(e); 
    e.Handled = true; 
} 

private void ListBox_PreviewMouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    SelectItemOnRightClick(e); 
    FriendContextMenu.PlacementTarget = sender as UIElement; 
    FriendContextMenu.IsOpen = true; 
} 

private void FriendsListBoxMouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    SelectItemOnRightClick(e); 
} 

private void SelectItemOnRightClick(System.Windows.Input.MouseButtonEventArgs e) 
{ 
    Point clickPoint = e.GetPosition(friendsListBox); 

    var listBoxItem = 
      friendsListBox.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem; 

    if (listBoxItem != null) 
    { 
     var nPotenialIndex = (int)(clickPoint.Y/listBoxItem.ActualHeight); 

     if (nPotenialIndex > -1 && nPotenialIndex < friendsListBox.Items.Count) 
     { 
      friendsListBox.SelectedItem = friendsListBox.Items[nPotenialIndex]; 
     } 
    } 
} 

private void ListBoxItem_MouseDoubleClick(object sender, RoutedEventArgs e) 
{ 
    if (friendsListBox.SelectedItem!=null) 
    { 
     var selectedFriend = (KeyValuePair<string, FriendData>)friendsListBox.SelectedItem; 
     //MessageBox.Show(selectedFriend.Value.ProfilePhoto.UriSource.OriginalString); 
     OpenWindow(FriendsData[selectedFriend.Value.Nick.ToLower()]); 
    } 
} 

Antwort

4

ein Element auf Rechtsklick wählen Sie diese stattdessen tun können. Es arbeitet mit Scroll-

private void SelectItemOnRightClick(System.Windows.Input.MouseButtonEventArgs e) 
{ 
    Point clickPoint = e.GetPosition(friendsListBox); 
    object element = friendsListBox.InputHitTest(clickPoint); 
    if (element != null) 
    { 
     ListBoxItem clickedListBoxItem = GetVisualParent<ListBoxItem>(element); 
     if (clickedListBoxItem != null) 
     { 
      friendsListBox.SelectedItem = clickedListBoxItem.Content; 
     } 
    } 
} 

public T GetVisualParent<T>(object childObject) where T : Visual 
{ 
    DependencyObject child = childObject as DependencyObject; 
    while ((child != null) && !(child is T)) 
    { 
     child = VisualTreeHelper.GetParent(child); 
    } 
    return child as T; 
} 
+1

+1, das ist ungefähr das, was ich im Sinne hatte ... Im übrigen wäre es auch ziemlich einfach sein, diesen Code in einen angeschlossenen Verhalten Refactoring, um sie leicht wiederverwendbar zu machen. –

+0

Meleak, vielen Dank. Gute Probe. Ein schönes Wochenende wünsche ich ihnen. –

Verwandte Themen