2015-11-11 95 views
1

在我的项目中,我需要实现一个事件,当弹出窗口或类似事件被拉起时触发,以便我可以关闭需要隐藏的任何内容,无论出于何种原因。实现从接口继承的事件

对于背景下,我在这里打球的3个文件,其中MainShell触发事件,IShell这是MainShell实现的接口和定义的事件,Reports来监听事件。我可以把这个事件放在MainShell中,让一切变得更简单,但是如果我这样做的话,项目引用将变成循环的。这正是我必须努力的。但是,我可以参考IShell接口,该接口定义MainShell使用的功能。不幸的是,似乎试图从派生类/接口中使用事件会导致实现由于某种原因变得非常复杂和挑剔。

在我的接口文件:

public class ModuleShownEventArgs : EventArgs { }  

public delegate void ModuleShownEventHandler(object sender, ModuleShownEventArgs e); 

public interface IShell { 
     event ModuleShownEventHandler ModuleShown; 
     ... } 

在我的听力课:

public Reports() { 
    ... 
    Container.Shell.ModuleShown += Shell_ModuleShown; 
    ... } 

private void Shell_ModuleShown(object sender, ModuleShownEventArgs e) {} 

在我的激发事件类:

event ModuleShownEventHandler IShell.ModuleShown 
{ 
    add 
    { 
     ((IShell)this).ModuleShown += value; 
    } 
    remove 
    { 
     ((IShell)this).ModuleShown -= value; 
    } 
} 

public void OnModuleShown() 
{ 
    ModuleShownEventHandler handler = ((IShell)this).ModuleShown; 
    if (handler != null) 
     handler(this, new ModuleShownEventArgs()); 
} 

我已经成功地阻止大部分的编译器的抱怨,但我有一个问题:有一个错误,我分配handler = ModuleShown,

事件“IShell.ModuleShown”只能出现在左侧的 + =或 - =

这使我很容易地从我的事件比较null检查,并阻止我从发射我的事件。

问题

我怎样才能得到这个工作?为什么我不能解雇我的活动?为什么当定义事件来自基类/接口时,定义事件变化如此激烈?请记住,这个项目相当庞大,我最近才开始研究它,所以我不能对它进行彻底的结构修改。

我使用的是Visual Studio 2013,而我的项目的.NET Framework版本是4.0。

+1

你是否尝试过同样的事情,但没有明确实现IShell(你没有显示完整的类声明,但在我看来IShell必须明确实现)?该处理程序分配(除其他外,如您在下面的注释中提到的)只能在定义事件属性的类的方法中执行;也许这需要投给IShell违反该规则。 –

+0

没问题,开心我可以帮忙。 –

回答

4

问题是您正在使用显式接口实现。您应该使用隐式代替。

public class Shell : IShell 
    { 
     public event ModuleShownEventHandler ModuleShown; 

     public void OnModuleShown() 
     { 
      ModuleShownEventHandler handler = ModuleShown; 
      if (handler != null) 
      { 
       handler(this, new ModuleShownEventArgs()); 
      } 
     } 
    } 

https://msdn.microsoft.com/en-us/library/ms173157.aspx

理想情况下,你会路过围绕实现IShell的作为接口,如果你的关心的是隐藏壳牌执行该事件的实例。通常,当你不希望你的类公开暴露一个接口特定的成员时,你使用显式的接口实现。

我希望这会有所帮助。

+0

在我开始搞清楚所有显式实现的东西之前,我确实尝试了这一点,但这次它工作。我想早些时候我没有注意到,没有我尝试构建项目,我的错误不能可靠地更新。谢谢! –

+0

现在我不得不面对一个新问题,即在事件之后调用的弹出窗口将动画触发到屏幕上,并且由于某种原因,我隐藏的iframe会一直等到该动画完成后才会消失... –

+1

I建议开始一个新的问题... –

-2

它应该看起来像这样。

public void OnModuleShown() 
{ 
    if (((IShell)this).ModuleShown != null); 
     (((IShell)this).ModuleShown)(this, new ModuleShownEventArgs()); 
} 
+0

我已经试过,其他行产生相同的错误。 –