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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

864閲覧

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

ElecDove

総合スコア254

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/07/05 06:37

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

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

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

C#

1 2<Window.Resources> 3 <ContextMenu x:Key="topLevelTreeMenu"> 4 <MenuItem Header="削除"/> 5 <Separator /> 6 <MenuItem Header="繰り返し回数"/> 7 </ContextMenu> 8 <Style x:Key="treeViewTopLevelStyle" TargetType="{x:Type TreeViewItem}"> 9 <Setter Property="ContextMenu" Value="{StaticResource topLevelTreeMenu}" /> 10 <EventSetter Event="TreeViewItem.MouseRightButtonDown" Handler="TreeViewItem_MouseRightButtonDown"/> 11 </Style> 12</Window.Resources> 13 14 15<TreeView Name="treeView" Margin="0,61,10,10" HorizontalAlignment="Right" Width="278" ItemsSource="{Binding MyEntitiesGroupsRoot}" > 16 <TreeView.ItemContainerStyle> 17 <Style TargetType="{x:Type TreeViewItem}"> 18 <Setter Property="ItemContainerStyle" Value="{StaticResource treeViewTopLevelStyle}"/> 19 </Style> 20 </TreeView.ItemContainerStyle> 21() 22 23 24 25//以下念のため 26//メインのクラス内 27 public List<MyEntitiesGroups> MyEntitiesGroupsRoot = new List<MyEntitiesGroups>(); 28 treeView.ItemsSource = MyEntitiesGroupsRoot;

実行イメージ

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

XML

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

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

C#

1private void TreeViewItem_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 2{ 3 //if (sender is TreeViewItem) 4 //{ 5 // var item = sender as TreeViewItem; 6 // //item.IsSelected = true; 7 // item.Focus(); 8 // e.Handled = true; 9 //} 10 11 var treeViewItem = FindParentVisual(e.OriginalSource as DependencyObject); 12 13 if (treeViewItem != null) 14 { 15 treeViewItem.Focus(); 16 e.Handled = true; 17 } 18} 19static TreeViewItem FindParentVisual(DependencyObject source) 20{ 21 while (source != null && (source is TreeViewItem) == false ) 22 source = VisualTreeHelper.GetParent(source); 23 return source as TreeViewItem; 24}

投稿2017/07/06 00:36

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2017/07/07 16: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に関しましては恥ずかしながら何が起きているのかさっぱりわかっていない状況でコピペで作っておりますので,何が問題で何が改善されたかもわかっておりません いただいたソースに変更させていただきます また,もしよろしければ解説もいただけないでしょうか よろしくお願いいたします.
ebiryo

2017/07/10 00:07

・まず確認ですが、本体の質問であった「ルート要素のコンテキストメニューが表示されない」は解決したと考えてよいですか? ・複数のプロパティもWindow.Resourcesで定義しているtreeViewTopLevelStyleに同じようにい書けばよいのでは? それともWindow.ResourcesではTreeView.Resourcesで定義したいけどわからないってことですか? そうであれば別の質問としたほうが良いと思います。 ・TreeViewItem_MouseRightButtonDownの処理の内容というのは質問者さんが参考にされたサイトに書いてある通り、「 アイテムの上で右クリックしたときにその項目が選択されない」を回避するためのものですよね(まず一読することをお勧めします)。理解できないのなら、まずは処理をしなかった場合どういう動きになるかを理解されたほうが説明がしやすいです。
ElecDove

2017/07/10 07: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様のソースも操作している限りでは同じ動きに見えます)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問