2010-11-19 26 views
1

マウスを右クリックするとリストボックス項目をどのように選択するのかがわかりますが、リストボックスをスクロールすると解決しない問題があります。リストボックスをスクロールすると、マウスの右ボタンでリストボックスを選択できますか?どんな進歩?WPFリストボックス項目をスクロールした後に右クリックすると表示されます

私のコードはここにある:

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

コードの後ろに:

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

答えて

4

右クリックで項目を選択するには、代わりにこれを行うことができます。それは、スクロール

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で動作しますが、それは私が考えていたものおおよそだ...ところで、また、簡単に再利用可能にするために、添付の行動にこのコードをリファクタリングするかなり簡単だろう。 –

+0

Meleak、ありがとう。良いサンプル。良い週末を。 –

関連する問題