После тестирования большинства ответов здесь, к сожалению, у меня ничего не получилось (VS2015).
Поэтому я добавил небольшой поворот к ответу JohnV , который не работал "из коробки", так как DesignMode является защищенным свойством в классе Control.
Сначала я создал метод расширения, который возвращает значение свойства DesignMode через Reflection:
public static Boolean GetDesignMode(this Control control)
{
BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static;
PropertyInfo prop = control.GetType().GetProperty("DesignMode", bindFlags);
return (Boolean)prop.GetValue(control, null);
}
и затем я сделал функцию, подобную JohnV:
public bool HostedDesignMode
{
get
{
Control parent = Parent;
while (parent != null)
{
if (parent.GetDesignMode()) return true;
parent = parent.Parent;
}
return DesignMode;
}
}
Это единственный метод, который сработал для меня, избегая всего беспорядка ProcessName, и хотя отражение не должно использоваться легкомысленно, в этом случае он сделал всю разницу! ;)
EDIT:
Вы также можете сделать вторую функцию методом расширения следующим образом:
public static Boolean IsInDesignMode(this Control control)
{
Control parent = control.Parent;
while (parent != null)
{
if (parent.GetDesignMode())
{
return true;
}
parent = parent.Parent;
}
return control.GetDesignMode();
}