【问题标题】:Right-click on a Listbox in a Silverlight 4 app右键单击 Silverlight 4 应用程序中的列表框
【发布时间】:2011-03-08 03:37:37
【问题描述】:
我正在尝试在 Winforms 应用程序中实现我过去认为理所当然的东西。我是 Silverlight 菜鸟,所以希望这一切都是初级的。
我在 Silverlight 4 应用中有一个列表框。我想做以下事情:
- 右键单击列表框
- 让我单击的位置下的项目突出显示自身
- 我想弹出一个上下文菜单(上下文菜单中有我自己的项目)
从我目前的研究来看,Silverlight 中似乎没有 ContextMenu 构造,而是我们必须构建一个 Grid/Canvas 结构并将其附加到一个 Popup 对象,然后弹出该对象。
我的问题如下:
- 要完成#2,我需要对列表框进行某种命中测试。我不知道该怎么做,我的 google-fu 也无济于事。
- 确定鼠标下的索引后,如何实际选择项目?
- 我可以在某处使用可重复使用的上下文菜单组件吗?如果组件允许任意子菜单,则额外计分。
【问题讨论】:
标签:
c#
menu
silverlight-4.0
right-click
hittest
【解决方案1】:
我一直在寻找同样的东西。我在 CodePlex 上查看了 Silverlight Control Toolkit 并浏览了示例(这是一个非常方便的资源),我发现这是您所问问题的解决方案:
为您的 ListBox 创建一个 ItemTemplate
在您希望 ItemTemplate 的“可右键单击”的部分中,设置存在于 System.Windows.Controls.Input.Toolkit 命名空间中的附加属性 ContextMenuService.ContextMenu
将 MenuItem 控件添加到 ContextMenu 并将 Click 属性设置为相应的单击事件处理程序
在事件处理程序中,从发送者那里获取DataContext(你可以使用它在ListBox中找到对应的元素)
要使该元素被选中,只需将列表框中的SelectedItem 属性设置为它
向事件处理程序添加任何自定义逻辑
示例页面中有一个示例,只需从导航窗格中转到“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;
}
我希望这会有所帮助:)
【解决方案2】:
有MouseRightButtonDown 事件。如果你把它绑定到ListBox:
<ListBox Height="143" Name="listBox1" Width="218"
MouseRightButtonDown="listBox1_MouseRightButtonDown" />
你会得到你需要的。后面的代码是:
private void listBox1_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
}
MouseButtonEventArgs 将通过GetPosition 方法为您提供职位。