/// <summary> /// Traces the specified path and builds the associated BreadcrumbItems. /// </summary> /// <param name="path">The traces separated by the SepearatorString property.</param> private bool BuildBreadcrumbsFromPath(string newPath) { PathConversionEventArgs e = new PathConversionEventArgs(PathConversionEventArgs.ConversionMode.EditToDisplay, newPath, Root, PathConversionEvent); RaiseEvent(e); newPath = e.DisplayPath; BreadcrumbItem item = RootItem; if (item == null) { this.Path = null; return false; } newPath = RemoveLastEmptySeparator(newPath); string[] traces = newPath.Split(new string[] { SeparatorString }, StringSplitOptions.RemoveEmptyEntries); if (traces.Length == 0) RootItem.SelectedItem = null; int index = 0; List<int> itemIndex = new List<int>(); // if the root is specified as first trace, then skip: int length = traces.Length; int max = BreadcrumbsToHide; if (traces.Length>index && max > 0 && traces[index] == (RootItem.TraceValue)) { length--; index++; max--; } for (int i = index; i < traces.Length; i++) { if (item == null) break; string trace = traces[i]; OnPopulateItems(item); object next = item.GetTraceItem(trace); if (next == null) break; itemIndex.Add(item.Items.IndexOf(next)); BreadcrumbItem container = item.ContainerFromItem(next); item = container; } if (length != itemIndex.Count) { //recover the last path: Path = GetDisplayPath(); return false; } // temporarily remove the SelectionChangedEvent handler to minimize processing of events while building the breadcrumb items: RemoveHandler(BreadcrumbItem.SelectionChangedEvent, new RoutedEventHandler(breadcrumbItemSelectedItemChanged)); try { item = RootItem; for (int i = 0; i < itemIndex.Count; i++) { if (item == null) break; item.SelectedIndex = itemIndex[i]; item = item.SelectedBreadcrumb; } if (item != null) item.SelectedItem = null; SelectedBreadcrumb = item; SelectedItem = item != null ? item.Data : null; } finally { AddHandler(BreadcrumbItem.SelectionChangedEvent, new RoutedEventHandler(breadcrumbItemSelectedItemChanged)); } return true; }
/// <summary> /// Gets the edit path from the tracess of the BreacrumbItems. /// </summary> /// <returns></returns> public string GetEditPath() { string displayPath = GetDisplayPath(); PathConversionEventArgs e = new PathConversionEventArgs(PathConversionEventArgs.ConversionMode.DisplayToEdit, displayPath, Root, PathConversionEvent); RaiseEvent(e); return e.EditPath; }
/// <summary> /// Gets the path of the specified BreadcrumbItem. /// </summary> /// <param name="item">The BreadrumbItem for which to determine the path.</param> /// <returns>The path of the BreadcrumbItem which is the concenation of all Traces from all selected breadcrumbs.</returns> public string PathFromBreadcrumbItem(BreadcrumbItem item) { StringBuilder sb = new StringBuilder(); while (item != null) { if (item == RootItem && sb.Length > 0) break; if (sb.Length > 0) sb.Insert(0, SeparatorString); sb.Insert(0, item.TraceValue); item = item.ParentBreadcrumbItem; } PathConversionEventArgs e = new PathConversionEventArgs(PathConversionEventArgs.ConversionMode.DisplayToEdit, sb.ToString(), Root, PathConversionEvent); RaiseEvent(e); return e.EditPath; }
private void BreadcrumbBar_PathConversion(object sender, PathConversionEventArgs e) { if (e.Mode == PathConversionEventArgs.ConversionMode.DisplayToEdit) { if (e.DisplayPath.StartsWith(@"Computer\", StringComparison.OrdinalIgnoreCase)) { e.EditPath = e.DisplayPath.Remove(0, 9); } else if (e.DisplayPath.StartsWith(@"Network\", StringComparison.OrdinalIgnoreCase)) { string editPath = e.DisplayPath.Remove(0, 8); editPath = @"\\" + editPath.Replace('\\', '/'); e.EditPath = editPath; } } else { if (e.EditPath.StartsWith("c:", StringComparison.OrdinalIgnoreCase)) { e.DisplayPath = @"Desktop\Computer\" + e.EditPath; } else if (e.EditPath.StartsWith(@"\\")) { e.DisplayPath = @"Desktop\Network\" + e.EditPath.Remove(0, 2).Replace('/', '\\'); } } }