WPFのTreeViewを使用しています。
選択したいItemのSelectは問題なく行えるのですが、スクロールが正常に行えません。
選択されてはいるが、手動でスクロールしないと見えないという状況です。
BringIntoViewを使用しています。選択は出来ているのに、使い方が間違っているんですかね。
他に何か良い解決策があれば教えて頂ければと思います。
よろしくお願いします。
C#
1 foreach (TreeNode childNode in treeview.Items) 2 { 3 if (ReferenceEquals(selectedItem, childNode.Tag)) 4 { 5 childNode.IsSelected = true; 6 childNode.BringIntoView(); 7 break; 8 } 9 }
開発環境:Visual Studio 2017 (WPF)
動作環境:Windows10
正常にスクロール、というのはどういうことでしょう。
何をどうしたいのか、詳しく説明しましょう
言葉足らずで申し訳ありません。
選択はされますが、表示される位置までスクロールしてくれないという意味です。
ListBoxなどですと、ScrollIntoViewなどで指定した位置まで少なくとも表示はされる位置まで自動でスクロールしてくれたと思いますが、TreeViewにはそれがありません。
FrameworkElement派生らしく、BringIntoViewを使用しましたが効果なしです。
この方法自体が悪いのかも知りたい所ですが、他に方法があるかも知りたいです。
TreeNode って、何者なんでしょう?
TreeViewItem を継承してるんでしょうか?
TreeViewItem の場合は BringIntoView でスクロールしますね。
回答遅くて申し訳ありません。
TreeNodeはFrameworkElementを継承しています。
FrameworkElement.BringIntoViewを呼び出していますが、前述のように選択はされる(直前のIsSeletedは効いている)のですが、見える位置まで自動でスクロールはしてくれません。
TreeViewItemであれば正常に動作してくれるということですね。
ここを読んでみてください。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.frameworkelement.bringintoview?view=netframework-4.7.2#System_Windows_FrameworkElement_BringIntoView_System_Windows_Rect_
> The expected behavior is that the event is handled by the parent element, marked handled in the event data, and the source of the event is brought into view through the logic embedded in the ScrollViewer control.
Zuishinさん、申し訳ありません。
上記サイトを読んでみましたが、スクロールしてくれない原因は分かりませんでした。
ネストされたノードではなく、ルート直下のItemを操作しようとしているので、下位階層のオープンなども関係ないと思うんですが。
話が食い違っているようですが、私が引用した個所を読みましたか?
申し訳ありません。
読んでみましたが、理解できませんでした。
要約するとそのノードが見えるようになる位置を自分で計算してそこまでのスクロールを実装しろと書いてあります。
あと理解できなかった時には「読んだ」と言わないでください。普通はそれを読んだとは言いませんから誤解が生じます。
ありがとうございます。
ただ、ノードが見えるように位置を自分で計算するロジックが分かりません。
これから調査していきます。
あなたの回答
tips
プレビュー