質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.08%

TreeView ルート要素のコンテキストメニューが表示されない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,607

ElecDove

score 257

お世話になっております.

TreeViewで各アイテムを右クリックした際にメニューを表示したいと思い
TreeViewのコンテキストメニューについて
というページを参考にコンテキストメニューを指定したのですが,ルート要素を右クリックしてもメニューが表示されません.(それ以外の要素はちゃんと出ます)
どのようにすればルートの要素でも表示されますでしょうか

指定部分のみ一応抜き出します.

<Window.Resources>
    <ContextMenu x:Key="topLevelTreeMenu">
        <MenuItem Header="削除"/>
        <Separator />
        <MenuItem Header="繰り返し回数"/>
    </ContextMenu>
    <Style x:Key="treeViewTopLevelStyle" TargetType="{x:Type TreeViewItem}">
        <Setter Property="ContextMenu" Value="{StaticResource topLevelTreeMenu}" />
        <EventSetter Event="TreeViewItem.MouseRightButtonDown" Handler="TreeViewItem_MouseRightButtonDown"/>
    </Style>
</Window.Resources>


<TreeView Name="treeView" Margin="0,61,10,10" HorizontalAlignment="Right" Width="278" ItemsSource="{Binding MyEntitiesGroupsRoot}" >
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="ItemContainerStyle" Value="{StaticResource treeViewTopLevelStyle}"/>
                </Style>
            </TreeView.ItemContainerStyle>
(略)



//以下念のため
//メインのクラス内
        public List<MyEntitiesGroups> MyEntitiesGroupsRoot = new List<MyEntitiesGroups>();
        treeView.ItemsSource = MyEntitiesGroupsRoot;


実行イメージ

よろしくお願いいたします.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

TreeのItemContainerStyleの指定は以下じゃないですかね?

<TreeView Grid.Column="3" ItemContainerStyle="{StaticResource treeViewTopLevelStyle}">
    <!--
    <TreeView.ItemContainerStyle>
      <Style TargetType="{x:Type TreeViewItem}">
       <Setter Property="ItemContainerStyle" Value="{StaticResource treeViewTopLevelStyle}"/>
      </Style>
     </TreeView.ItemContainerStyle>-->

また、TreeViewItem_MouseRightButtonDownは右クリックされたノードを選択状態にするためのものだと思いますが、以下のようにしないとダメだと思います。

private void TreeViewItem_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    //if (sender is TreeViewItem)
    //{
    //    var item = sender as TreeViewItem;
    //    //item.IsSelected = true;
    //    item.Focus();
    //    e.Handled = true;
    //}

    var treeViewItem = FindParentVisual(e.OriginalSource as DependencyObject);

    if (treeViewItem != null)    
    {
        treeViewItem.Focus();
        e.Handled = true;
    }
}
static TreeViewItem FindParentVisual(DependencyObject source)
{
    while (source != null && (source is TreeViewItem) == false )
        source = VisualTreeHelper.GetParent(source);
    return source as TreeViewItem;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/08 01:18

    回答ありがとうございます.

    ItemContainerStyleなのですが,次のように複数のプロパティに対して設定しているのですが,どのように書けばよいでしょうか(質問ではIsExpandedなどは不要と思い省いてしまいました)

    <TreeView Name="treeView" Margin="0,61,10,64" HorizontalAlignment="Right" Width="278" ItemsSource="{Binding MyEntitiesGroupsRoot}">
    <TreeView.Resources>
    <Style TargetType="TreeViewItem">
    <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
    <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
    <Setter Property="ItemContainerStyle" Value="{StaticResource treeViewTopLevelStyle}"/>
    </Style>
    </TreeView.Resources>

    TreeViewItem_MouseRightButtonDownに関しましては恥ずかしながら何が起きているのかさっぱりわかっていない状況でコピペで作っておりますので,何が問題で何が改善されたかもわかっておりません

    いただいたソースに変更させていただきます
    また,もしよろしければ解説もいただけないでしょうか

    よろしくお願いいたします.

    キャンセル

  • 2017/07/10 09:07

    ・まず確認ですが、本体の質問であった「ルート要素のコンテキストメニューが表示されない」は解決したと考えてよいですか?

    ・複数のプロパティもWindow.Resourcesで定義しているtreeViewTopLevelStyleに同じようにい書けばよいのでは? それともWindow.ResourcesではTreeView.Resourcesで定義したいけどわからないってことですか?
    そうであれば別の質問としたほうが良いと思います。

    ・TreeViewItem_MouseRightButtonDownの処理の内容というのは質問者さんが参考にされたサイトに書いてある通り、「 アイテムの上で右クリックしたときにその項目が選択されない」を回避するためのものですよね(まず一読することをお勧めします)。理解できないのなら、まずは処理をしなかった場合どういう動きになるかを理解されたほうが説明がしやすいです。

    キャンセル

  • 2017/07/10 16:53

    コメントを書いたときには解決していなかったのですが,今もう一度やり直してみたところルート要素でも表示されるようになりました.ありがとうございました.

    最終的にはこのようになりました.
    <TreeView Name="treeView" Margin="0,61,10,64" HorizontalAlignment="Right" Width="278" ItemsSource="{Binding MyEntitiesGroupsRoot}" ItemContainerStyle="{StaticResource treeViewTopLevelStyle}">
    <TreeView.Resources>
    <Style TargetType="TreeViewItem">
    <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
    <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
    </Style>
    </TreeView.Resources>

    MouseRightButtonDownの処理についてはこれがない場合の挙動は把握しております.
    また,サイトの説明は読みましたが,なぜサイトのソースが問題でEbiryo様のソースでなければならないかがわかりません
    (サイトのソースも,Ebiryo様のソースも操作している限りでは同じ動きに見えます)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.08%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る