3

我正在尝试在 Winforms 应用程序中实现我过去认为理所当然的东西。我是 Silverlight 新手,所以希望这一切都是初级的。

我在 Silverlight 4 应用程序中有一个列表框。我想做以下事情:

  1. 右键单击列表框
  2. 让我单击的位置下的项目突出显示自身
  3. 我想弹出一个上下文菜单(上下文菜单中有我自己的项目)

从我目前的研究来看,Silverlight 中似乎没有 ContextMenu 构造,相反,我们必须构建一个 Grid/Canvas 结构并将其附加到一个 Popup 对象,然后弹出该对象。

我的问题如下:

  1. 为了完成#2,我需要对列表框进行某种命中测试。我不知道该怎么做,我的 google-fu 也无济于事。
  2. 一旦我确定了鼠标下的索引,我如何实际选择该项目?
  3. 我可以在某处使用可重用的上下文菜单组件吗?如果组件允许任意子菜单,则额外计分。
4

2 回答 2

3

我一直在寻找同样的东西。我检查了CodePlex 的Silverlight Control Toolkit并浏览了示例(这是一个非常方便的资源),这是我发现的解决您所问问题的方法:

  1. 为您的 ListBox 创建一个 ItemTemplate

  2. 在您希望成为 ItemTemplate 的“可右键单击”的部分中,设置命名空间ContextMenuService.ContextMenu中存在的附加属性System.Windows.Controls.Input.Toolkit

  3. 将 MenuItem 控件添加到您的 ContextMenu 并将 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;
    }

我希望这有帮助 :)

于 2011-01-09T13:50:22.500 回答
1

MouseRightButtonDown活动。如果您将其绑定在ListBox

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

你会得到你需要的。后面的代码是:

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

MouseButtonEventArgs通过该GetPosition方法为您提供职位。

于 2010-11-03T10:38:00.117 回答