在Silverlight 4应用程序中右键单击Listbox

3
我正在尝试在 Silverlight 应用程序中实现我以前在 Winforms 应用程序中理所当然的功能。我是一个 Silverlight 新手,希望这一切都很基础。
我在 Silverlight 4 应用程序中有一个列表框。我想要做以下事情:
1. 右键单击列表框 2. 让鼠标点击位置下方的项目突出显示 3. 我想弹出一个上下文菜单(其中包含我的自定义菜单项)
从我目前的研究来看,似乎在 Silverlight 中没有 ContextMenu 构造,而是我们必须建立一个 Grid/Canvas 结构并将其附加到 Popup 对象,然后才会弹出该对象。
我的问题如下:
1. 要完成第二步,我需要在列表框上进行某种命中测试。我无法弄清楚如何做到这一点,我的 Google 搜索也没有帮助。 2. 一旦我确定了鼠标下方的索引,如何实际选择该项? 3. 是否有可重复使用的上下文菜单组件可以使用?如果该组件允许任意子菜单,则额外得分。
2个回答

3
我一直在寻找同样的东西。我查看了CodePlex上的Silverlight Control Toolkit并浏览了示例(这是一个非常方便的资源),以下是我发现的解决方案:
  1. 为您的ListBox创建ItemTemplate
  2. 在您的ItemTemplate中希望“右键单击”的部分设置附加属性ContextMenuService.ContextMenu,该属性存在于System.Windows.Controls.Input.Toolkit名称空间中
  3. 向您的ContextMenu添加MenuItem控件,并将Click属性设置为相应的Click事件处理程序
  4. 在事件处理程序中,从发送者获取DataContext(您可以使用它来找到ListBox中对应的元素)
  5. 要使该元素被选中,只需将ListBox中的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

这里有一个 MouseRightButtonDown 事件。如果你在 ListBox 上绑定它:

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

你将得到你所需的。背后的代码是:

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

MouseButtonEventArgs 会通过 GetPosition 方法提供位置信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接