我正在开发一个插件应用程序。我有一个frmDatasheet.cs(后端)和它的DatasheetPlugin.cs(前端)。我正在处理此数据表和模型插件之间的广播事件,因此,如果有人返回数据表,进行一些更改,然后返回到建模,则建模将了解新状态并更新自身。
我遇到的问题是调用广播是在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();
这可能是问题吗?获得新的数据表插件......清除它,但我怎么能得到.Broadcast?
这是我在DatasheetPlugin.cs中的代码
public void Broadcast(IDictionary<string,object> packedState)
{
signaller.RaiseBroadcastRequest(packedState);
}
我没有收到错误,但信号器显示事件(BroadcastState,ProjectOpened,ProjectSaved),但它们都具有空值。然后它进入信号器,检查BroadcastState是否有任何用户,因为signaller为空而失败。
如何确保从frmDatasheet返回插件时,一切仍然完好无损?如果我在插件中本地调用.Broadcast对某些click事件,则signaller不为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);
}
感谢您的任何见解!!
答案 0 :(得分:0)
当您实例化具有以下行的新的DatasheetPlugin类时:
private VBTools.Signaller signaller; //declared at top of plugin
“signaller”对象在您实例化之前将为null,在调用OnImportsSatisfied()时会出现这种情况。所以当你说你在打电话时......
private DatasheetPlugIn frmState = new DatasheetPlugIn();
...在文件的顶部,如果你从不调用“OnImportsSatisfied()”,信号器将为空。
可能是您在类成员变量和静态变量之间感到困惑。 http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx
答案 1 :(得分: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(),因此我不会丢失任何在两个类之间来回传输的内容。我从frmDSheet中的GoToModeling click方法中取出了我需要的东西,然后将它移到了PackState,这样我就可以在广播之前抓住它。