0

我正在开发一个插件应用程序。我有一个 frmDatasheet.cs(后端),它是 DatasheetPlugin.cs(前端)。我正在处理此数据表和模型插件之间的广播事件,因此如果有人返回数据表,进行一些更改,然后返回建模,建模将知道新状态并自行更新。

我遇到的问题是对 Broadcast 的调用在 frmDatasheet 中,它转到 datasheetPlugin 以引发广播请求,我得到空值,因为我离开插件然后又回到它,一切都丢失了那来回。这是我的代码:

//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);            
 }

我没有收到错误,但信号器显示了事件(BroadcastState、ProjectOpened、ProjectSaved),但它们都有空值。然后它转到信号器,检查 BroadcastState 是否有任何订阅者,因为信号器为空而失败。

我如何确保当我从 frmDatasheet 返回插件时,一切都完好无损?如果我在某个点击事件的插件中本地调用 .Broadcast,则信号器不为空。所以,我很确定这是由于来回而不是保留信息。

更新:我可能应该包含与信号器相关的代码。每个插件都有:

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

当您实例化具有此行的新 DatasheetPlugin 类时:

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

在您实例化它之前,“signaller”对象将为空,这在调用 OnImportsSatisfied() 时似乎是这样做的。所以当你说你在打电话时...

private DatasheetPlugIn frmState = new DatasheetPlugIn();

...在文件的顶部,如果您从不调用“OnImportsSatisfied()”,则信号器将为空。

您可能对类成员变量和静态变量感到困惑。http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

于 2012-06-15T14:27:08.110 回答
0

为了解决这个问题,我将 GoToModeling 点击事件放在了 DSPlugin 中(在 frmDSheet 中)。

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

然后用要发送到同一个 DSPlugin 中的 Broadcast() 的数据表的当前状态填充 packedState,所以我不会在两个类之间来回丢失任何东西。我从 frmDSheet 中的 GoToModeling click 方法中获取了我需要的内容,并将其移至 PackState,以便在广播之前也可以获取它。

于 2012-06-15T16:27:24.777 回答