WPF выберите элемент списка при щелчке правой кнопкой мыши после прокрутки списка - PullRequest
1 голос
/ 19 ноября 2010

Я нашел какое-то решение, как выбрать элемент списка при щелчке правой кнопкой мыши, но любое решение не работает после прокрутки списка. Можно ли выбрать список на правой кнопке мыши, если прокрутить также список? Есть аванс?

Мой код здесь:

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

1 Ответ

4 голосов
/ 19 ноября 2010

Чтобы выбрать элемент по правому клику, вы можете сделать это вместоРаботает со свитком

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...