.NET рдШрдЯрдХ - рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рдЯреНрд░реА рд╡реНрдпреВ

рдЬрдм рдЯреНрд░реАрд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрдЬ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рддреЛ рдореИрдВрдиреЗ рдЦреЛрдЬ рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ рдЕрдкрдиреА рдЪрдпрдирд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд┐рдпрд╛ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдорд╛рдирдХ WPF рдЯреНрд░реА рд╡реНрдпреВ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрдпрдирд┐рдд рд╕рдВрдкрддреНрддрд┐ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЯреНрд░реАрд╡реНрдпреВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд IsSelected рдФрд░ IsExpanded рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреЗрд╢ рдХрд░рдирд╛ рдерд╛ рдФрд░ рдЗрди рдЧреБрдгреЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд TreeViewItem рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдерд╛ред ( рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╡реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ )
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рдкрд░ IsSelected рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдкреВрд░реНрд╡рдЬреЛрдВ рдкрд░ IsExpanded ред
рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ...
  1. рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд╕реНрддреБ IsSelected рдФрд░ IsExpanded рд╣реЛред рдФрд░ рдкреЗрдбрд╝ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдиреАрд░рд╕ рд╣реИред
  2. рдПрдХ рдкреЗрдбрд╝ рдЦреЛрдЬ рдХреЛ рд╣рд░ рдмрд╛рд░ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдиреНрдпреВрдирддрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╢рдмреНрдж рдореЗрдВ рднреНрд░рдо рд╣реЛрддрд╛ рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдереЛрдбрд╝рд╛ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж рдРрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЖрдИред


рдЗрд╕ рддрд░рд╣ рдореИрдВрдиреЗ рд╕рднреА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЦреЛрдЬреЗред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИред
public override void OnApplyTemplate() { base.OnApplyTemplate(); templateDescrColl = new TemplateDescriptionCollection();//    List<FrameworkElement> parents= Helper.GetAllParent(this);//    FindDataTemplatesResources(this.Resources);//      foreach (FrameworkElement parent in parents) //     { FindDataTemplatesResources(parent.Resources); } FindDataTemplatesResources(System.Windows.Application.Current.Resources);//      } 

рдпрд╣рд╛рдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдирд┐рдпреЛрдЬрд┐рдд рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЦреЛрдЬ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╣реИред
рдпрд╣ рдПрдХ рдУрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдЗрдВрдбрд░реЛрдВ рдХреА рдЦреЛрдЬ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
(рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдиреЛрдб рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред
рджреВрд╕рд░реА рдУрд░, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдкрде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ FindPatches рдЧреБрдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ "TypeName1: Property1, Property2 TypeName:"
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, TypeName1 рдХреЛ Properties1 рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛, Property2, рдФрд░ TypeName2 рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
  private void FindDataTemplatesResources(ResourceDictionary Resource) { foreach (object xxx in Resource.Values) { DataTemplate dataTemplate = xxx as DataTemplate; if (dataTemplate != null)//  a DataTemplate { bool hierarhical=false; if (!templateDescrColl.ExistType(dataTemplate.DataType as Type, out hierarhical))//     { TemplateBindingDescr templateBindingDescr = new TemplateBindingDescr();// HierarchicalDataTemplate hdt = xxx as HierarchicalDataTemplate;//  HierarchicalDataTemplate here if (hdt != null) { Binding ItemsSourceBinding = hdt.ItemsSource as Binding; string ItemsSourcePath = ItemsSourceBinding.Path.Path; templateBindingDescr.itemSourcePath = ItemsSourcePath;//       templateBindingDescr.IsHierathical = true; } Type tType = dataTemplate.DataType as Type; templateBindingDescr.TargetType = tType; // type  if (! String.IsNullOrWhiteSpace (FindPatches) && FindPatches.Contains (tType.Name + ":")) //       { Match match = Regex.Match (FindPatches, tType.Name + ":([^:]*)");. if (match.Success) { string re = match.Groups [1]. Value; string [] pathes = re.Split (','); templateBindingDescr.BindingPathes.AddRange (pathes); } } else //       { FrameworkElement frameworkElement = dataTemplate.LoadContent () as FrameworkElement; //   List <FrameworkElement> DependencyObjects = Helper.GetAllVisualChildren (frameworkElement);//     if (DependencyObjects!= null) { foreach (FrameworkElement dependencyObject in DependencyObjects) { //    BindingExpression BE = System.Windows.Data.BindingOperations.GetBindingExpression (dependencyObject, TextBlock.TextProperty); if (BE!= null) { string path = BE.ParentBinding.Path.Path; templateBindingDescr.BindingPathes.Add (path); } } } } templateDescrColl.Add (templateBindingDescr); //    } } } } 

рдпрд╣ рд╣реИ рдХрд┐ рдЦреЛрдЬ рдкрд╛рда рд╡рд╛рд▓реЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рдЦреЛрдЬ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИред
  /// <summary> ///                     FindText ///    /// </summary> /// <param name="control"></param> /// <param name="FindText"></param> /// <returns></returns> public List<NamedObject> FindObjectByPropertyNames(IEnumerable itemsSource, List<int> path) { List<NamedObject> ret = new List<NamedObject>();//       int i = 0; path.Add(i);//      foreach (object Item in itemsSource) //    { path[path.Count - 1] = i;//      TemplateBindingDescr desctiption= templateDescrColl.Get(Item.GetType());//        string subItemsPath=desctiption.itemSourcePath;//      string ObjectText=String.Empty;//           bool ok=false; foreach (string findPath in desctiption.BindingPathes)//         { object ItemVal = Item.GetObjectSubItem(findPath); //    if (ItemVal != null )//    { string ItemText = ItemVal.ToString().ToUpper();//    ObjectText += ItemText + " "; if (ItemText.Contains(FindText.ToUpper())) { ok = true; //      } } } if (ok)//     { List<int> path2 = new List<int>(); path2.AddRange(path); ret.Add(new NamedObject() { Name = ObjectText, Item = Item, Path = path2 });//     } if (subItemsPath != null)//      { IEnumerable subItems=Item.GetObjectSubItem(subItemsPath) as IEnumerable; if (subItems != null) { List<int> path1 = new List<int>(); path1.AddRange(path); ret.AddRange(FindObjectByPropertyNames(subItems, path1)); } } i++; } return ret; } 

рдпрд╣ рд╣реИ рдХрд┐ рдЦреЛрдЬ рдкрд╛рда рд╡рд╛рд▓реЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рдЦреЛрдЬ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИред
 int failCount; //   //    void SelectNodeByPath(ItemsControl control, IEnumerable<int> path) { List<int>L= path.ToList<int>(); if (L.Count == 0) { return; } if (control.Items.Count > L[0]) { do //         { control.UpdateLayout(); } while (control.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated); TreeViewItem dObject = control.ItemContainerGenerator.ContainerFromIndex(L[0]) as TreeViewItem; if (dObject == null)//       { dObject = GetTreeViewItem(control, L [0]); } if (dObject == null) { MessageBox.Show("   ); } else //  { L.RemoveAt(0); if (L.Count == 0) //       { dObject.IsSelected = true; dObject.BringIntoView(); } else //        { dObject.IsExpanded = true; SelectNodeByPath(dObject, L); //   } } } else { MessageBox.Show(" "+control.Items.Count+"   > "+L[0]); } } 


GetTreeViewItem рдлрд╝рдВрдХреНрд╢рди (рдирд┐рдпрдВрддреНрд░рдг, рдПрд▓ [0]); рдЖрдкрдХреЛ рдордЬрд╝рдмреВрддреА рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЧрд╛рдБрда рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рд╛рдЗрдЯ рд╕реЗ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред
blogs.msdn.com/b/wpfsdk/archive/2010/02/23/finding-an-object-treeviewitem.aspx
рдпрд╣рд╛рдБ рдирдпрд╛ рдХреЛрдб рд╣реИ
myTreeViewWith search.zip
рдЦреЛрдЬ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИред

рдПрдХ рдЙрдиреНрдирдд рдЦреЛрдЬ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрди рдЧреБрдгреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХреЗ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░рдирд╛ рд╣реИ
рдФрд░ ... рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдВрдХрд░рдг рд╣реИ, рд╡рд┐рдЪрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдкреБрдирд╢реНрдЪ рдкреЛрд╕реНрдЯ рдХреЗ рд▓реЗрдЦрдХ, рдореЗрд░реЗ рднрд╛рдИ SergejSh - рдЗрд╕ рдкрд░ рд╕рднреА рдкреНрд░рд╢реНрди рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВред

Source: https://habr.com/ru/post/In135274/


All Articles