2010-11-19 20 views
1

Sağ fare düğmesindeki liste kutusu öğesinin nasıl tıklandığına dair bir çözüm buluyorum, ancak liste kutusunu kaydırdıktan sonra herhangi bir çözüm çalışmıyor. Liste kutusunu da kaydırırsam, sağ fare tuşundaki liste kutusunu seçebilir miyim? Herhangi bir gelişme var mı?WPF liste kutusu öğesini sağ listeye kaydırdıktan sonra sağ tuşla seçin

Kodum burada: geride

<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> 

Kodu:

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

cevap

4

Sağ tıklamada bir öğeyi seçmek için bunun yerine bunu yapabilirsiniz. O ben arada, aynı zamanda kolayca yeniden kullanılabilir hale getirmek için, ekli davranışı bu kodu refactor çok kolay olurdu ... aklındakini kabaca var, kaydırma

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 ile çalışır. –

+0

Meleak, çok teşekkür ederim. Iyi örnek. Güzel hafta sonları. –