/// <summary>
        /// Creates a StackPanel item.
        /// </summary>
        /// <param name="parent"> The control that was expanded. </param>
        /// <param name="name"> The property name. </param>
        /// <param name="value"> The property value (as a string). </param>
        /// <param name="key"> A key that can be used to retrieve further properties. </param>
        /// <param name="valueColor"> The color to use for the value. </param>
        /// <returns> A control that should be inserted into the Items collection. </returns>
        private Control CreateControl(ExpanderButton parent, string name, string value, object key, Color valueColor)
        {
            // Create the content portion.
            var content = new TextBlock();

            if (name == null)
            {
                content.Inlines.Add(new Run()
                {
                    Text = value
                });
            }
            else
            {
                content.Inlines.Add(new Run()
                {
                    Foreground = new SolidColorBrush(Colors.Purple), Text = name
                });
                content.Inlines.Add(new Run()
                {
                    Foreground = new SolidColorBrush(valueColor), Text = ": " + value
                });
            }

            // Create tag information to attach to the control.
            var tagInfo = new TagInfo();

            tagInfo.Key    = key;
            tagInfo.Parent = parent;

            // Calculate the left margin.
            var leftMargin = parent == null ? 0 : parent.Margin.Left + 8;

            // Use an expander if the value is an object.
            if (key != null)
            {
                var result = new ExpanderButton();
                result.Margin     = new Thickness(leftMargin, 0, 0, 0);
                result.Tag        = tagInfo;
                result.Content    = content;
                result.Checked   += new RoutedEventHandler(OnChecked);
                result.Unchecked += new RoutedEventHandler(OnUnchecked);
                return(result);
            }
            else
            {
                var result = new ContentControl();
                result.Content = content;
                result.Margin  = new Thickness(leftMargin + 16, 0, 0, 0);
                result.Tag     = tagInfo;
                return(result);
            }
        }
 /// <summary>
 /// Determines if a control is a logical child of another control.
 /// </summary>
 /// <param name="child"></param>
 /// <param name="ancestor"></param>
 /// <returns></returns>
 private static bool HasAncestor(FrameworkElement child, ExpanderButton ancestor)
 {
     while (true)
     {
         var parent = ((TagInfo)child.Tag).Parent;
         if (parent == null)
             return false;
         if (parent == ancestor)
             return true;
         child = parent;
     }
 }
 /// <summary>
 /// Determines if a control is a logical child of another control.
 /// </summary>
 /// <param name="child"></param>
 /// <param name="ancestor"></param>
 /// <returns></returns>
 private static bool HasAncestor(FrameworkElement child, ExpanderButton ancestor)
 {
     while (true)
     {
         var parent = ((TagInfo)child.Tag).Parent;
         if (parent == null)
         {
             return(false);
         }
         if (parent == ancestor)
         {
             return(true);
         }
         child = parent;
     }
 }
        /// <summary>
        /// Creates a StackPanel item.
        /// </summary>
        /// <param name="parent"> The control that was expanded. </param>
        /// <param name="name"> The property name. </param>
        /// <param name="value"> The property value (as a string). </param>
        /// <param name="key"> A key that can be used to retrieve further properties. </param>
        /// <param name="valueColor"> The color to use for the value. </param>
        /// <returns> A control that should be inserted into the Items collection. </returns>
        private Control CreateControl(ExpanderButton parent, string name, string value, object key, Color valueColor)
        {
            // Create the content portion.
            var content = new TextBlock();
            if (name == null)
            {
                content.Inlines.Add(new Run() { Text = value });
            }
            else
            {
                content.Inlines.Add(new Run() { Foreground = new SolidColorBrush(Colors.Purple), Text = name });
                content.Inlines.Add(new Run() { Foreground = new SolidColorBrush(valueColor), Text = ": " + value });
            }

            // Create tag information to attach to the control.
            var tagInfo = new TagInfo();
            tagInfo.Key = key;
            tagInfo.Parent = parent;

            // Calculate the left margin.
            var leftMargin = parent == null ? 0 : parent.Margin.Left + 8;

            // Use an expander if the value is an object.
            if (key != null)
            {
                var result = new ExpanderButton();
                result.Margin = new Thickness(leftMargin, 0, 0, 0);
                result.Tag = tagInfo;
                result.Content = content;
                result.Checked += new RoutedEventHandler(OnChecked);
                result.Unchecked += new RoutedEventHandler(OnUnchecked);
                return result;
            }
            else
            {
                var result = new ContentControl();
                result.Content = content;
                result.Margin = new Thickness(leftMargin + 16, 0, 0, 0);
                result.Tag = tagInfo;
                return result;
            }
        }