namespace System.Windows.Forms { static class ControlExtension { /// /// Performs an action on a control after its handle has been created. If the control's handle has already been created, the action is executed immediately. /// /// This control. /// The action to execute. public static void CallWhenHandleValid(this Control ctrl, Action action) { if (ctrl.IsHandleCreated) { action(ctrl); } else { LayoutEventHandler handler = null; handler = (sender, e) => { if (ctrl.IsHandleCreated) { ctrl.Layout -= handler; action(ctrl); } }; ctrl.Layout += handler; } } /// /// Gets the control in the list of parents of type T. /// /// The based of the parent control to retrieve. /// This control. /// The parent control matching T or null if not found. [Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] public static T GetParent(this Control ctrl) where T : Control, new() { Control p = ctrl.Parent; while (p != null & !(p is T)) p = p.Parent; return p as T; } /// /// Gets the top-most control in the list of parents of type T. /// /// The based of the parent control to retrieve. /// This control. /// The top-most parent control matching T or null if not found. public static T GetTopMostParent(this Control ctrl) where T : Control, new() { var stack = new System.Collections.Generic.Stack(); Control p = ctrl.Parent; while (p != null) { stack.Push(p); p = p.Parent; } while (stack.Count > 0) if ((p = stack.Pop()) is T) return p as T; return null; } /// /// Gets the right to left property. /// /// This control. /// Culture defined direction of text for this control. public static RightToLeft GetRightToLeftProperty(this Control ctrl) { if (ctrl.RightToLeft == RightToLeft.Inherit) return GetRightToLeftProperty(ctrl.Parent); return ctrl.RightToLeft; } /// /// Determines whether this control is in design mode. /// /// This control. /// true if in design mode; otherwise, false. public static bool IsDesignMode(this Control ctrl) { Control p = ctrl; while (p != null) { var site = p.Site; if (site != null && site.DesignMode) return true; p = p.Parent; } return false; } } }