0

私はプラグインアプリケーションに取り組んでいます。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);
}

洞察をありがとう!!

4

2 に答える 2

0

この問題を解決するために、GoToModeling クリック イベントを DSPlugin に配置しました (frmDSheet にありました)。

void btnGoToModeling_Click(object sender, EventArgs e)
{
    IDictionary<string, object> packedState = new Dictionary<string, object>();
    packedState = _frmDatasheet.PackState();
    Broadcast(packedState);
}

次に、packedState に、同じ DSPlugin にある Broadcast() に送信されるデータシートの現在の状態が入力されるため、2 つのクラス間を行ったり来たりしても何も失われません。frmDSheet の GoToModeling クリック メソッドから必要なものを取得し、それを PackState に移動して、ブロードキャストする前に取得できるようにしました。

于 2012-06-15T16:27:24.777 に答える
0

この行を持つ新しい DatasheetPlugin クラスをインスタンス化すると:

private VBTools.Signaller signaller;  //declared at top of plugin

「signaller」オブジェクトは、インスタンス化するまで null になります。これは、OnImportsSatisfied() を呼び出すときにそうするように見えます。だから電話してるって言ったら…

private DatasheetPlugIn frmState = new DatasheetPlugIn();

...ファイルの先頭で、「OnImportsSatisfied()」を呼び出さないと、シグナルは null になります。

クラスメンバー変数と静的変数の間で混乱している可能性があります。http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

于 2012-06-15T14:27:08.110 に答える