/// <summary> /// TreeViewのアイテムが選択された場合のスクロール /// </summary> /// <param name="page"></param> private void updateSelectedItemFromTreeView(MLTPage page) { PageListView obj; if (this.View.TryGetTarget(out obj)) { obj.AAListBox.ScrollIntoView(page); } }
/// <summary> /// ListViewの選択アイテム変更 /// </summary> /// <param name="page"></param> private void updateSelectedItem(MLTPage page) { if (page != null) { PageListView obj; if (this.View.TryGetTarget(out obj)) { obj.SelectedItem = page; } } }
/// <summary> /// ListViewの選択に合わせて、TreeViewの状態を更新 /// </summary> /// <param name="page"></param> private void updateSelectedItemFromListView(MLTPage page) { if (page == null || this.MLTPageIndexList.Value == null) { return; } foreach (var node in this.MLTPageIndexList.Value) { if (node.Page == page) { // 一致したら選択状態にする(一応子要素は閉じる) node.IsExpanded.Value = false; node.IsSelected.Value = true; break; } else { // 子要素のチェック if (node.Children == null) { // なければ選択状態を解除 node.IsExpanded.Value = false; continue; } // 子要素のチェック // MLTの仕様として、子要素の確認は1段のみでよい foreach (var child in node.Children) { if (child.Page == page) { // 一致ししたら子要素を開いて、選択状態にする node.IsExpanded.Value = true; child.IsSelected.Value = true; break; } // 一致しなかったら子要素を閉じて、選択状態を解除 node.IsExpanded.Value = false; child.IsSelected.Value = false; } } } }
private void TreeViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // SelectedItemChangedイベントの処理だと、ListBoxの選択時に交互に更新が走ってデッドロックする可能性がある // そのため、TreeViewのほうはMouseLeftButtonDownイベントで実装する(Selectでは更新はかけない) TreeViewItem item = (TreeViewItem)sender; var pageIndex = item.DataContext as MLTPageIndex; this.SelectedItem = pageIndex.Page; // ここら辺のFocusの処理がなんで必要なのかはいまいち不明瞭 // http://stackoverflow.com/questions/30356236/mouseleftbuttondown-event-not-raised-in-treeviewitem-why item.Focusable = true; item.Focus(); item.Focusable = false; e.Handled = true; }