private static void SelectPath(TreeView treeView, string value) { if (value == null) { TreeViewItem item = treeView.SelectedItem as TreeViewItem; if (item != null) { item.IsSelected = false; } } else { value = NormalizePath(value); var paths = SubPaths(value); FoldersTreeViewItem currentItem = treeView.Items[0] as FoldersTreeViewItem; bool needSelect = true; foreach (var path in paths) { currentItem.IsExpanded = true; var childItem = currentItem.Items.OfType<FoldersTreeViewItem>().FirstOrDefault(i => path.Equals((i.Tag as FolderInfo)?.Path, StringComparison.OrdinalIgnoreCase)); if (childItem != null) { currentItem = childItem; } else { needSelect = false; } } if (needSelect) { //currentItem.IsExpanded = true; currentItem.IsSelected = true; MethodInfo selectMethod = typeof(TreeViewItem).GetMethod("Select", BindingFlags.NonPublic | BindingFlags.Instance); selectMethod.Invoke(currentItem, new object[] { true }); currentItem.BringIntoView(); //treeView.Focus(); // TODO: notify property changed } } }
private FoldersTreeViewItem CreateItem(FolderInfo folderInfo) { var item = new FoldersTreeViewItem(); item.Header = folderInfo.Title; item.Tag = folderInfo; item.Expanded += new RoutedEventHandler(folder_Expanded); if (folderInfo.Path != null) { item.Items.Add(null); } return item; }
protected override void OnSelectedItemChanged(RoutedPropertyChangedEventArgs<object> e) { base.OnSelectedItemChanged(e); FoldersTreeViewItem temp = (FoldersTreeViewItem)this.SelectedItem; if (temp != null) { var folderInfo = temp.Tag as FolderInfo; SelectedPath = folderInfo.Path; } }
void folder_Expanded(object sender, RoutedEventArgs e) { FoldersTreeViewItem item = (FoldersTreeViewItem)sender; if (item.Items.Count == 1 && item.Items[0] == null) { item.Items.Clear(); try { var folderInfo = item.Tag as FolderInfo; foreach (string s in GetDirectories(folderInfo.Path)) { item.Items.Add(CreateItem(new FolderInfo() { Title = Path.GetFileName(s), Path = s, Icon = GetIcon(s) })); } } catch (Exception) { } } }