• Helper methods


    ///<summary>

    /// Attempts to find the child framework element recursively from a given parent root object.

    ///</summary>

    ///<param name="currentObject">the parent root object</param>

    ///<param name="childElementName">the name of the child element</param>

    ///<param name="childElement">the child element which was found</param>

    private FrameworkElement GetChildElement(DependencyObject currentObject, string childElementName)

    {

    FrameworkElement childElement = null;

    if (currentObject == null || string.IsNullOrEmpty(childElementName))

    {

    return null;

    }

    if (currentObject is FrameworkElement && (currentObject as FrameworkElement).Name == childElementName)

    {

    childElement = currentObject as FrameworkElement;

    return childElement;

    }

    foreach (object child in LogicalTreeHelper.GetChildren(currentObject))

    {

    if (child is DependencyObject)

    {

    childElement = GetChildElement(child as DependencyObject, childElementName);

    if (childElement != null)

    break;

    }

    }

    return childElement;

    }

    对于微软的itemscontrol,获取其dataTemplate

    /// Get all the visual childs in the current item of ItemsControl

    ///</summary>

    ///<param name="itemsControl">The items control which the current item belongs to.</param>

    ///<param name="currentItem">The current item in the items control.</param>

    ///<param name="visualChildName">The spcified visual child's name</param>

    ///<returns>Return all the visual childs in the current item.</returns>

    private childType GetVisualChildrenInDataTemplate<childType>(ItemsControl itemsControl, object currentItem, string visualChildName) where childType : class

    {

    ContentPresenter itemContainer = itemsControl.ItemContainerGenerator.ContainerFromItem(currentItem) as ContentPresenter;

    if (itemContainer != null)

    {

    object visualChild = null;

    DataTemplate dataTemplate = itemContainer.ContentTemplate;

    if (dataTemplate != null)

    {

    itemContainer.ApplyTemplate(); //有时候会报template没应用到control的错误。

    visualChild = dataTemplate.FindName("NotificationChisel", itemContainer);

    if (visualChild != null && visualChild is childType)

    {

    return visualChild as childType;

    }

    }

    }

    return null;

    }

    对于复杂的items control,如第三方控件的,需要用snoop看下可视树来确定寻找的element.

    ///<summary>

    /// Get all the visual childs in the current item of ItemsControl

    ///</summary>

    ///<param name="itemsControl">The items control which the current item belongs to.</param>

    ///<param name="currentItem">The current item in the items control.</param>

    ///<param name="visualChildName">The spcified visual child's name</param>

    ///<returns>Return all the visual childs in the current item.</returns>

    private List<childType> GetVisualChildrenInDataTemplate<childType>(ItemsControl itemsControl, object currentItem, string visualChildName)

    {

    List<childType> visualChilds = new List<childType>();

    DependencyObject itemContainer = itemsControl.ItemContainerGenerator.ContainerFromItem(currentItem);

    if (itemContainer != null)

    {

    object visualChild = null;

    foreach (ContentPresenter conentPresenter in WPFUtils.GetVisualChildrenOfType<ContentPresenter>(itemContainer))

    {

    DataTemplate dataTemplate = conentPresenter.ContentTemplate;

    if (dataTemplate != null)

    {

    visualChild = dataTemplate.FindName(visualChildName, conentPresenter);

    if (visualChild != null && visualChild is childType)

    {

    visualChilds.Add((childType)visualChild);

    }

    }

    }

    }

    return visualChilds;

    }

    ///<summary>

    /// Get all the childs with the given type within the curent parent.

    ///</summary>

    ///<typeparam name="childType">the type of child which need to find.</typeparam>

    ///<param name="parent">the relative parent object</param>

    ///<returns>the returned child collection</returns>

    public static List<childType> GetVisualChildrenOfType<childType>(DependencyObject parent) where childType : DependencyObject

    {

    List<childType> childList = new List<childType>();

    FindVisualChilds(parent, childList);

    return childList;

    }

    private static void FindVisualChilds<childType>(DependencyObject parent, List<childType> childs) where childType : DependencyObject

    {

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)

    {

    DependencyObject child = VisualTreeHelper.GetChild(parent, i);

    if (child == null)

    {

    break;

    }

    if (child is childType)

    {

    if (childs == null)

    {

    childs = new List<childType>();

    }

    childs.Add((childType)child);

    }

    else

    {

    FindVisualChilds<childType>(child, childs);

    }

    }

    }

  • 相关阅读:
    WPF自定义加载控件
    C# 动态调用Webservice
    C#程序执行Python脚本
    C#监控U盘插拔
    WPF—编程宝典P1
    详解S7源码3-COTP and TPKT
    详解S7源码(1)----Types
    详解S7源码2----Conversition
    P18 FlipPanel控件的讲解
    WPF编程宝典P18----ColorPicker 和FlipPanel的讲解
  • 原文地址:https://www.cnblogs.com/liangouyang/p/1368245.html
Copyright © 2020-2023  润新知