【问题标题】:Right-click on a Listbox in a Silverlight 4 app右键单击 Silverlight 4 应用程序中的列表框
【发布时间】:2011-03-08 03:37:37
【问题描述】:

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

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

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

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

我的问题如下:

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

【问题讨论】:

    标签: c# menu silverlight-4.0 right-click hittest


    【解决方案1】:

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

    1. 为您的 ListBox 创建一个 ItemTemplate

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

    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;
        }
    

    我希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      MouseRightButtonDown 事件。如果你把它绑定到ListBox:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-03-09
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-02
        • 2012-01-02
        相关资源
        最近更新 更多