Detecting design mode from a Control's constructor
You can use the LicenceUsageMode enumeration in the System.ComponentModel
namespace:
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
DesignMode with nested Controls
Revisiting this question, I have now 'discovered' 5 different ways of doing this, which are as follows:
System.ComponentModel.DesignMode property
System.ComponentModel.LicenseManager.UsageMode property
private string ServiceString()
{
if (GetService(typeof(System.ComponentModel.Design.IDesignerHost)) != null)
return "Present";
else
return "Not present";
}
public bool IsDesignerHosted
{
get
{
Control ctrl = this;
while(ctrl != null)
{
if((ctrl.Site != null) && ctrl.Site.DesignMode)
return true;
ctrl = ctrl.Parent;
}
return false;
}
}
public static bool IsInDesignMode()
{
return System.Reflection.Assembly.GetExecutingAssembly()
.Location.Contains("VisualStudio"))
}
To try and get a hang on the three solutions proposed, I created a little test solution - with three projects:
- TestApp (winforms application),
- SubControl (dll)
- SubSubControl (dll)
I then embedded the SubSubControl in the SubControl, then one of each in the TestApp.Form.
This screenshot shows the result when running.
This screenshot shows the result with the form open in Visual Studio:
Conclusion: It would appear that without reflection the only one that is reliable within the constructor is LicenseUsage, and the only one which is reliable outside the constructor is 'IsDesignedHosted' (by BlueRaja below)
PS: See ToolmakerSteve's comment below (which I haven't tested): "Note that IsDesignerHosted answer has been updated to include LicenseUsage..., so now the test can simply be if (IsDesignerHosted). An alternative approach is test LicenseManager in constructor and cache the result."
Winform Custom Control: DesignMode doesn't return true whereas in Design Mode
LicenseManager.UsageMode
is intended for this.
It is in fact the only reliable way to detect if your control is in design mode or not. It's only valid during the constructor, but it can easily be stored in a field of the class for later reference.
The DesignMode
property for nested controls will be false even when the container control is in design mode.
How to tell if .NET code is being run by Visual Studio designer
To find out if you're in "design mode":
- Windows Forms components (and controls) have a DesignMode property.
- Windows Presentation Foundation controls should use the IsInDesignMode attached property.
Knowing when in design mode
I don't think Component.DesignMode will help in this case. What if the component or control is not loaded on the forms designer ? What you may try in this case is, create an enum that only sets the one value at normal startup which otherwise remains to another value by default. You can now check the value of the enum instance and decide if it's a design-time or runtime.
Are there any caveats to swapping out DesignMode for LicenseManager.UsageMode in a WinForms UserControl constructor?
According to someone who posted a comment on my answer to another question, using LicenseManager
doesn't work in an OnPaint
method.
Related Topics
How to Access a Variable from Another Script in Another Gameobject Through Getcomponent
Generic Repository or Specific Repository for Each Entity
Getting the Size of a Field in Bytes with C#
Easiest Way to Create a Cascade Dropdown in ASP.NET MVC 3 with C#
Convert Integer to Binary in C#
How to Elevate Privileges Only When Required
Send a File via Http Post with C#
Parallel.Foreach and Async-Await
Using JSONconvert.Deserializeobject to Deserialize JSON to a C# Poco Class
Async/Await With/Without Awaiting (Fire and Forget)
How to Mock the Httpcontext in ASP.NET MVC Using Moq
Most Common C# Bitwise Operations on Enums
Variable Scope Confusion in C#
C# Linq Group by on Multiple Columns
Why Filesystemwatcher Doesn't Work in Linux Container Watching Windows Volume