我正在使用winforms,并且我试图在设计器中显示form \ component \ usercontrol的任何时候链接某些事件,我试图链接一些从应用程序加载首选项的静态事件.config文件。
我是否可以在我的项目中定义代码“任何时候加载控件,执行此事件?”
编辑这绝对是设计时间。
我有一个基本表单,在DLL“A”中。这有很多属性,“ColorLocation,SizeLocation”,以及那种性质的东西。
在DLL“B”中,我有一个派生形式。当B加载到设计器中时,我有iEditorComponents(不记得确切名称),允许用户从当前项目的app.config设置文件中指定的大量项目中选择ColorLocation。
问题是,编辑组件在Dll“A”中,它是基础,并且它无法访问“B”中的app.config。
我需要告诉编辑组件“嘿,使用这个字符串列表来填充你的编辑控件”。设计师正在尽其所能,似乎不想在派生类中执行任何代码。
答案 0 :(得分:3)
是的,这是可能的,但要确保你在做什么,因为听起来很奇怪。
在Form's
或Control's
构造函数中使用以下代码:
public void Form1()
{
InitializeComponent();
if (IsInWinFormsDesignMode())
{
// your code stuff here
}
}
public static bool IsInWinFormsDesignMode()
{
bool returnValue = false;
#if DEBUG
if ( System.ComponentModel.LicenseManager.UsageMode ==
System.ComponentModel.LicenseUsageMode.Designtime )
{
returnValue = true;
}
#endif
return returnValue;
}
希望它有所帮助。
答案 1 :(得分:1)
我不知道这是否适用于您的特定用例,但在某个时间点我需要与Component的容器(即表单)进行交互,因此我最终从ErrorProvider“窃取”代码:
//code goes in your Component/Control
private ContainerControl _containerControl = null;
//Will contain a reference to the Form hosting this Component
public ContainerControl ContainerControl
{
get { return _containerControl; }
set { _containerControl = value;
//In here setup what you need from the Form
//for example add a handler
}
}
//Allows the VS.NET designer to set the ContainerControl
//in the designer code. Stolen from ErrorProvider.
public override ISite Site
{
set
{
base.Site = value;
if (value != null)
{
IDesignerHost host = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (host != null)
{
IComponent rootComponent = host.RootComponent;
if (rootComponent is ContainerControl)
{
this.ContainerControl = (ContainerControl)rootComponent;
}
}
}
}
}
我还使用StringConverter派生类与Designer中的外部资源进行交互:
public class OpcDotNetTagConverter : StringConverter
{
#region Make It A ComboBox
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
#endregion
#region Display Tags In List
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if ((context == null) || (context.Container == null))
{
return null;
}
Object[] Tags = this.GetTagsFromServer(context);
if (Tags != null)
{
return new StandardValuesCollection(Tags);
}
return null;
}
private object[] GetTagsFromServer(ITypeDescriptorContext context)
{
List<string> availableTags = new List<string>();
if (context.Instance == null)
{
availableTags.Add("ITypeDescriptorContext.Instance is null");
return availableTags.ToArray();
}
Interfaces.IOpcDotNetServerEnabled inst = context.Instance as Interfaces.IOpcDotNetServerEnabled;
if (inst == null)
{
availableTags.Add(context.Instance.ToString());
return availableTags.ToArray();
}
if (inst.OpcDotNetServer == null)
{
availableTags.Add("No server selected");
return availableTags.ToArray();
}
availableTags = inst.OpcDotNetServer.GetTagList(string.Empty);
availableTags.Sort(Comparer<string>.Default);
return availableTags.ToArray();
}
#endregion
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if(sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
return value.ToString();
return base.ConvertFrom(context, culture, value);
}
}
我希望这可以提供一些帮助。
干杯