对于一个小项目,我创建了一个用于创建插件的基本界面。此接口具有返回UserControl的函数。但是,当调用此对象并将UserControl添加到面板时,面板中不会显示任何内容(即使设置了.Show()
或Visibility = true
)。我假设当调用assembly.CreateInstance()
时,这会创建类中任何对象的实例。
情况不是这样吗?是否需要在所有UserControl上调用CreateInstance()
才能以这种方式使用它们?
public interface IMyInterface
{
System.Windows.Forms.UserControl GetConfigurationControl();
}
在dll中实现了类:
public class myClass: IMyInterface
{
return new myUserControl();
}
加载目录中的所有dll:
private void LoadPlugins()
{
foreach (string file in Directory.GetFiles(Application.StartupPath+"/plugins/", "*.dll", SearchOption.AllDirectories))
{
Assembly assembly = Assembly.LoadFile(file);
var types = from t in assembly.GetTypes()
where t.IsClass &&
(t.GetInterface(typeof(IMyInterface).Name) != null)
select t;
foreach (Type t in types)
{
IMyInterface plugin = (IMyInterface)assembly.CreateInstance(t.FullName, true);
this.pluginsList.Add(plugin); //just a list of the plugins
}
}
this.AddPluginUserControls();
}
将用户控件添加到面板:
private AddPluginUserControls()
{
foreach (IMyInterface plugin in pluginsList)
{
myPanel.Controls.Add(plugin.GetConfigurationControl());
}
}
我知道其他完整的插件架构,但这更像是一个学习应用程序。 谢谢!
用户控件:
public partial class myUserControl: UserControl
{
public myUserControl()
{
InitializeComponent(); // couple of labels, vs generated.
}
}
答案 0 :(得分:1)
确保两件事
1.在默认的myUserControl
构造函数中,调用InitializeComponent(),它将实例化并将标签添加到控件中。
2.在添加到面板之前,为用户控件提供一些宽度和高度。
答案 1 :(得分:0)
找到它吧!使用System.Windows.Forms.FlowLayoutPanel和将DockStyle设置为填充的UserControl是一个问题。谢谢你的所有答案!