3

マイナー プロジェクトでは、プラグインの作成に使用する基本的なインターフェイスを作成しました。このインターフェイスには、UserControl を返す関数があります。ただし、これが呼び出され、UserControl がパネルに追加されると、パネルには何も表示されません ( .Show()orVisibility = trueが設定されていても)。assembly.CreateInstance()が呼び出されると、クラス内の任意のオブジェクトのインスタンスが作成されると想定していました。

そうではありませんか?CreateInstance()この方法で使用する前に、すべての UserControls でaを呼び出す必要がありますか?

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.
    }
}
4

2 に答える 2

1

2 つのことを確認してmyUserControlください。2. パネルに追加する前に、ユーザー コントロールに幅と高さを指定します。

于 2013-05-20T11:54:44.980 に答える
0

正に見つけた!これは、System.Windows.Forms.FlowLayoutPanel と、DockStyle が fill に設定された UserControl を使用する際の問題でした。すべての回答に感謝します!

于 2013-05-21T01:03:36.473 に答える