簡體   English   中英

右鍵單擊Silverlight 4應用程序中的列表框

[英]Right-click on a Listbox in a Silverlight 4 app

我試圖在Winforms應用程序中實現我以前認為理所當然的東西。 我是一個Silverlight菜鳥,所以希望這一切都是基本的。

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

  1. 右鍵單擊列表框
  2. 將項目置於我單擊突出顯示的位置下方
  3. 我想要彈出一個上下文菜單(在上下文菜單中有我自己的項目)

從我到目前為止的研究來看,似乎Silverlight中沒有ContextMenu構造,而是我們必須構建一個Grid / Canvas結構並將其附加到Popup對象,然后彈出該對象。

我的問題如下:

  1. 為了完成#2,我需要在列表框上進行某種命中測試。 我無法弄清楚如何做到這一點,我的google-fu沒有幫助。
  2. 一旦我確定鼠標下的索引,我該如何選擇項目?
  3. 我可以使用某個可重用的Context菜單組件嗎? 如果組件允許任意子菜單,則額外信用。

我一直在四處尋找同樣的事情。 我檢查了CodePlex上的Silverlight Control Toolkit並瀏覽了樣本(這是一個非常方便的資源),這就是我發現的問題的解決方案:

  1. 為ListBox創建一個ItemTemplate

  2. 在您想要“右鍵單擊”ItemTemplate的部分中,設置System.Windows.Controls.Input.Toolkit命名空間中存在的附加屬性ContextMenuService.ContextMenu

  3. 將MenuItem控件添加到ContextMenu,並將Click屬性設置為相應的單擊事件處理程序

  4. 在事件處理程序中,從發件人獲取DataContext(您可以使用它來查找ListBox中的相應元素)

  5. 要使該元素為Selected,只需在列表框中設置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;
    }

我希望這有幫助 :)

MouseRightButtonDown事件。 如果你在ListBox上綁定它:

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

你會得到你需要的東西。 背后的代碼是:

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

MouseButtonEventArgs將通過GetPosition方法為您提供位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM