私はプラグインアプリケーションに取り組んでいます。frmDatasheet.cs (バックエンド) があり、それは DatasheetPlugin.cs (フロントエンド) です。このデータシートとモデル プラグインの間のブロードキャスト イベントに取り組んでいるので、誰かがデータシートに戻って変更を加えてからモデリングに戻った場合、モデリングは新しい状態を認識し、それ自体を更新します。
私が抱えている問題は、Broadcast への呼び出しが frmDatasheet にあり、datasheetPlugin に移動して Broadcast Request を発生させることです。プラグインを離れてから戻ってくると、すべてが失われます。その前後。これが私のコードです:
//in the frmDatasheet.cs, click GoToModeling, this is last few lines
IDictionary<string, object> packedState = new Dictionary<string, object>();
packedState = PackState(); <----packs up state to send
frmState.Broadcast(packedState); <----- had to instantiate new Plugin to get at .Broadcast
frmDataSheet.cs の上部
private DatasheetPlugIn frmState = new DatasheetPlugIn();
これが問題なのではないでしょうか?? 新しい DatasheetPlugin を取得する..これで問題は解決しますが、他にどのように .Broadcast を取得できますか?
これが DatasheetPlugin.cs の私のコードです
public void Broadcast(IDictionary<string,object> packedState)
{
signaller.RaiseBroadcastRequest(packedState);
}
エラーは発生しませんが、Signaller にはイベント (BroadcastState、ProjectOpened、ProjectSaved) が表示されますが、すべて null 値です。次に、signaller に移動し、BroadcastState にサブスクライバーがあるかどうかを確認しますが、signaller が null であるため失敗します。
frmDatasheet からプラグインに戻ったときに、すべてがそのままであることを確認するにはどうすればよいですか? .Broadcast への呼び出しをプラグインのクリック イベントでローカルに配置すると、シグナルは null ではありません。だから、私はそれが前後に情報を保存していないことが原因であると確信しています。
更新: おそらく、シグナルに関連するコードを含める必要があります。各プラグインには次のものがあります。
private VBTools.Signaller signaller; //declared at top of plugin
//This function imports the signaller from the VBProjectManager
//Happens when app loads for each plugin.
[System.ComponentModel.Composition.Import("Signalling.GetSignaller", AllowDefault = true)]
public Func<VBTools.Signaller> GetSignaller
{
get;
set;
}
public void OnImportsSatisfied()
{
//If we've successfully imported a Signaller, then connect its events to our handlers.
signaller = GetSignaller();
signaller.BroadcastState += new VBTools.Signaller.BroadCastEventHandler<VBTools.BroadCastEventArgs>(BroadcastStateListener);
signaller.ProjectSaved += new VBTools.Signaller.SerializationEventHandler<VBTools.SerializationEventArgs>(ProjectSavedListener);
signaller.ProjectOpened += new VBTools.Signaller.SerializationEventHandler<VBTools.SerializationEventArgs>(ProjectOpenedListener);
this.MessageSent += new MessageHandler<VBTools.MessageArgs>(signaller.HandleMessage);
}
洞察をありがとう!!