Щелкните правой кнопкой мыши по списку в приложении Silverlight 4 - PullRequest
3 голосов
/ 25 июня 2010

Я пытаюсь реализовать то, что раньше считало само собой разумеющимся в приложениях Winforms.Я нуб Silverlight, так что, надеюсь, все это элементарно.

У меня есть список в приложении Silverlight 4.Я хотел бы сделать следующее:

  1. Щелкните правой кнопкой мыши по списку
  2. Поместите элемент в том месте, где я нажимаю, выделите само
  3. Я быкак всплывающее контекстное меню (с моими собственными элементами в контекстном меню)

Из моих исследований, похоже, что в Silverlight нет конструкции ContextMenu, вместо этого нам нужно создать Grid/ Структура холста и присоединение его к объекту Popup, который затем появляется.

У меня следующие вопросы:

  1. Чтобы выполнить # 2, мне нужен какой-то видпроверка попадания в список.Я не могу понять, как это сделать, и мой Google-фу не помогает.
  2. Как только я идентифицирую указатель под мышью, как мне на самом деле выбрать элемент?
  3. Есть ли где-нибудь повторно используемый компонент контекстного меню, который я могу использовать?Дополнительный кредит, если компонент допускает произвольные подменю.

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Я искал то же самое. Я проверил Silverlight Control Toolkit в CodePlex и просмотрел примеры (это очень удобный ресурс), и вот что я нашел решением для того, что вы спросили:

  1. Создать шаблон элемента для вашего ListBox

  2. в той части, которую вы хотите, чтобы «щелкнув правой кнопкой мыши» вашего ItemTemplate, установите вложенное свойство ContextMenuService.ContextMenu, которое существует в System.Windows.Controls.Input.Toolkit пространстве имен

  3. добавить элементы управления MenuItem в ContextMenu и установить свойство Click для соответствующего обработчика события click

  4. в обработчике событий получите DataContext от отправителя (вы можете использовать его для поиска соответствующего элемента в ListBox)

  5. , чтобы сделать этот элемент выбранным, просто установите для него свойство SelectedItem в списке

  6. Добавить любую пользовательскую логику в обработчик событий

На странице примеров есть пример, просто перейдите в «Input-> ContextMenu» из панели навигации.

Если вы хотите что-то краткое, вот упрощенный пример:

<ListBox ItemsSource="{StaticResource People}"
             Name="myListBox">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}">
                    <controlsInputToolkit:ContextMenuService.ContextMenu>
                        <controlsInputToolkit:ContextMenu>
                            <controlsInputToolkit:MenuItem Header="Show in MessageBox"
                                                           Click="show_Click" />
                        </controlsInputToolkit:ContextMenu>
                    </controlsInputToolkit:ContextMenuService.ContextMenu>
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
</ListBox>

с:

xmlns:controlsInputToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"

для кода:

private void show_Click(object sender, RoutedEventArgs e)
    {
        var person = ((MenuItem)sender).DataContext as Person;
        if (null == person) return;
        MessageBox.Show("My Name is: " + person.Name);
        myListBox.SelectedItem = person;
    }

Надеюсь, это поможет:)

1 голос
/ 03 ноября 2010

Это событие MouseRightButtonDown. Если вы связываете это на ListBox:

<ListBox Height="143" Name="listBox1" Width="218"
         MouseRightButtonDown="listBox1_MouseRightButtonDown" />

вы получите то, что вам нужно. Код позади:

private void listBox1_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
}

MouseButtonEventArgs даст вам позицию с помощью метода GetPosition.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...