WPF模板 按名称找模板中控件出现null的问题 又进坑一次:不能在构造函数中获取ControlTemplate,那样会显示null,可以再窗体load事件以及控件的事件中使用

不能在构造函数中获取ControlTemplate,那样会显示null

UI需要加载窗体,需要一个时间,所以要注意顺序,不能在构造函数中获取ControlTemplate,那样会显示null,可以再窗体load事件以及控件的事件中使用

DataTemplate要注意以上方法是通过遍历item得到的,也就是说如果你的ItemBox,ItemView等等还没加载数据源,即没有item时不能使用,会报null

但是不用getcontrol获取控件, 在构造函数中改绑定的数据是可以更新界面的。

WPF模板 按名称找模板中控件出现null的问题 又进坑一次:不能在构造函数中获取ControlTemplate,那样会显示null,可以再窗体load事件以及控件的事件中使用_第1张图片

WPF模板 按名称找模板中控件出现null的问题 又进坑一次:不能在构造函数中获取ControlTemplate,那样会显示null,可以再窗体load事件以及控件的事件中使用_第2张图片

WPF模板 按名称找模板中控件出现null的问题 又进坑一次:不能在构造函数中获取ControlTemplate,那样会显示null,可以再窗体load事件以及控件的事件中使用_第3张图片

 public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
 {
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
     {
         DependencyObject child = VisualTreeHelper.GetChild(obj, i);
         if (child != null && child is childItem)
         {
             return (childItem)child;
         }
         else
         {
             childItem childOfChild = FindVisualChild<childItem>(child);
             if (childOfChild != null)
                 return childOfChild;
         }
     }
     return null;
 }
 //按控件名 获得ListBox中的控件
 public static object getControl(ListBox myListBox,int index,string FindName)
 {
     try
     {
         //var el = myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.GetItemAt(index)) as ListBoxItem;
         //if (el != null && el is ListBoxItem)
         //{
         //    ListBoxItem myListBoxItem = (ListBoxItem)el;
         //    ContentPresenter myContentPresenter = FindVisualChild(myListBoxItem);
         //    DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
         //    return myDataTemplate.FindName(FindName, myContentPresenter);
         //}


         ListBoxItem myListBoxItem = (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.GetItemAt(index)));
         // Getting the currently selected ListBoxItem
         // Note that the ListBox must have
         // IsSynchronizedWithCurrentItem set to True for this to work
         // ListBoxItem myListBoxItem = (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));

         // Getting the ContentPresenter of myListBoxItem
         ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem);

         // Finding textBlock from the DataTemplate that is set on that ContentPresenter
         DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
         //TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter);

         // Do something to the DataTemplate-generated TextBlock
         //MessageBox.Show("The text of the TextBlock of the selected list item: "  + myTextBlock.Text);
         return myDataTemplate.FindName(FindName, myContentPresenter);
         // BindingSettingsClass o = (BindingSettingsClass)(myListBox.Items.GetItemAt(i));

     }
     catch { }
     return null;
 }

你可能感兴趣的:(wpf,template,模板)