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 に答える