Is there a better way to get a child? I have written the following code to get ImageColorPicker child:

foreach (CustomTabItem customTabItem in SelectedWindowsTabControl.Items)
{
    TabItem ti = tabControl.ItemContainerGenerator.ContainerFromItem(customTabItem) as TabItem;
    Popup popup = (Helpers.FindVisualChild&lt;Popup&gt;(ti) as Popup);
    ImageColorPicker icp = (popup.Child as StackPanel).Children[0] as ImageColorPicker;

    ...
}

public class Helpers
{
    /// &lt;summary&gt;
    /// Return the first visual child of element by type.
    /// &lt;/summary&gt;
    /// &lt;typeparam name="T"&gt;The type of the Child&lt;/typeparam&gt;
    /// &lt;param name="obj"&gt;The parent Element&lt;/param&gt;
    public static T FindVisualChild&lt;T&gt;(DependencyObject obj) where T : DependencyObject
    {
        for (int i = 0; i &lt; VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if (child != null &amp;&amp; child is T)
                return (T)child;
            else
            {
                T childOfChild = FindVisualChild&lt;T&gt;(child);
                if (childOfChild != null)
                    return childOfChild;
            }
        }
        return null;
    }
}


Here's the control template XAML of the TabItem (the relevant part):

&lt;ControlTemplate TargetType="{x:Type local:CustomTabItem}"&gt;
    &lt;Grid Height="26" Background="{TemplateBinding Background}"&gt;
        &lt;Grid.ColumnDefinitions&gt;
            &lt;ColumnDefinition Width="Auto" /&gt;
            &lt;ColumnDefinition Width="Auto" /&gt;
        &lt;/Grid.ColumnDefinitions&gt;
        &lt;ContentPresenter Margin="5,0" HorizontalAlignment="Left" VerticalAlignment="Center" ContentSource="Header"&gt;
        &lt;/ContentPresenter&gt;
        &lt;StackPanel Grid.Column="1" Height="16" Margin="0,0,1,0" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal"&gt;
            &lt;ToggleButton x:Name="Edit" Width="16" Content="&amp;#xE104;" Style="{StaticResource CustomizedMetroTabItemToggleButton}" ToolTip="Edit" /&gt;
            &lt;Popup HorizontalOffset="{Binding Width, ElementName=Edit}" IsOpen="{Binding IsChecked, Mode=TwoWay, ElementName=Edit}" Placement="Left" PlacementTarget="{Binding ElementName=Edit}" PopupAnimation="Slide" StaysOpen="False" VerticalOffset="{Binding ActualHeight, ElementName=Edit}"&gt;
                &lt;StackPanel&gt;
                    &lt;local:ImageColorPicker x:Name="ColorPicker" Width="100" Height="100" HorizontalAlignment="Center" Source="Images/ColorWheel.png" /&gt;
                &lt;/StackPanel&gt;
            &lt;/Popup&gt;
        &lt;/StackPanel&gt;
    &lt;/Grid&gt;
&lt;/ControlTemplate&gt;


Is there a better way to get the ImageColorPicker than what I've done? (getting the TabItem, then the Popup and then the ImageColorPicker, I am sure there's a shorter way)
I don't like a class that's just called Helpers - that's generally a code smell, something that ends up a big dumping ground for anything that doesn't quite fit anywhere else. Be more specific when naming things, perhaps VisualHierarchyHelper would be a better name?
I'm using a very similar method - the main difference is essentially the number ot return statements, and the childName parameter; I found this code on Stack Overflow a little while ago:
    /// &lt;summary&gt;
    /// Finds a Child of a given item in the visual tree. 
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;parent&quot;&gt;A direct parent of the queried item.&lt;/param&gt;
    /// &lt;typeparam name=&quot;T&quot;&gt;The type of the queried item.&lt;/typeparam&gt;
    /// &lt;param name=&quot;childName&quot;&gt;x:Name or Name of child. &lt;/param&gt;
    /// &lt;returns&gt;The first parent item that matches the submitted type parameter. 
    /// If not matching item can be found, 
    /// a null parent is being returned.&lt;/returns&gt;
    /// &lt;remarks&gt;
    /// https://stackoverflow.com/a/1759923/1188513
    /// &lt;/remarks&gt;
    public static T FindChild&lt;T&gt;(this DependencyObject parent, string childName)
       where T : DependencyObject
    {
        if (parent == null) return null;

        T foundChild = null;

        var childrenCount = VisualTreeHelper.GetChildrenCount(parent);
        for (var i = 0; i &lt; childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            var childType = child as T;
            if (childType == null)
            {
                foundChild = FindChild&lt;T&gt;(child, childName);
                if (foundChild != null) break;
            }
            else if (!string.IsNullOrEmpty(childName))
            {
                var frameworkElement = child as FrameworkElement;
                if (frameworkElement != null &amp;&amp; frameworkElement.Name == childName)
                {
                    foundChild = (T)child;
                    break;
                }
            }
            else
            {
                foundChild = (T)child;
                break;
            }
        }

        return foundChild;
    }

Notice the guard clause preventing a NullReferenceException that your method would throw if obj was null. I think this is a pretty neat way of finding a child node in the visual tree.
That said, it might be personal preference, but I think the readability of your code could benefit from implicit typing (var), especially in cases like this where the type is already pretty obvious:
TabItem ti = tabControl.ItemContainerGenerator.ContainerFromItem(customTabItem) as TabItem;
Popup popup = (Helpers.FindVisualChild&lt;Popup&gt;(ti) as Popup);
ImageColorPicker icp = (popup.Child as StackPanel).Children[0] as ImageColorPicker;

Becomes:
var ti = tabControl.ItemContainerGenerator.ContainerFromItem(customTabItem) as TabItem;
var popup = (Helpers.FindVisualChild&lt;Popup&gt;(ti) as Popup);
var icp = (popup.Child as StackPanel).Children[0] as ImageColorPicker;

And here you would have to make sure popup isn't null before accessing its Child member, if you want to avoid that possible NullReferenceException.
Also, you're casting too much - T should be of the type you've specified, so the return type of FindChild&lt;ImageColorPicker&gt; is ImageColorPicker, casting it to ImageColorPicker is redundant.

Update
The ImageColorPicker child has a Popup parent, which has a StackPanel parent, which has a Grid parent, which has a TabItem parent.
You're not fully using the recursiveness of your function when you're getting the color picker. I'd believe you could get it like this:
var tab = tabControl.ItemContainerGenerator.ContainerFromItem(customTabItem) as TabItem;
var picker = VisualHierarchyHelper.FindChild&lt;ImageColorPicker&gt;(tab, &quot;ColorPicker&quot;);

That should work, because the search is recursive; you don't need to get everything in-between.