C# 如何在接口中声明事件处理程序?

C# 如何在接口中声明事件处理程序?,c#,silverlight,events,silverlight-4.0,interface,C#,Silverlight,Events,Silverlight 4.0,Interface,我有几个Silverlight 4 UI对象(导航页面更像它),它们必须实现两件事:OnError事件处理程序和Refresh()方法 因此,我尝试了以下方法: public interface IDynamicUI { event EventHandler<ErrorEventArgs> OnError; void Refresh(); } public class ErrorEventArgs : EventArgs { public string Me

我有几个Silverlight 4 UI对象(导航页面更像它),它们必须实现两件事:OnError事件处理程序和Refresh()方法

因此,我尝试了以下方法:

public interface IDynamicUI
{
    event EventHandler<ErrorEventArgs> OnError;
    void Refresh();
}

public class ErrorEventArgs : EventArgs
{
    public string Message { get; set; }
    public Exception Error { get; set; }
}
对于所有MVVM/MVC的粉丝们。。。嗯,不是这样。我确实知道,如果采用MVVM方法来实现这一点,会容易得多,但是应用程序已经编写好了,我不会从头重写它(

谢谢
Martin

尝试将其定义为
事件操作OnError;

创建接口信息

创建类实现信息

创建一个控制台应用程序,如下所示

产出:知情


您的第一个代码段在这里编译得很好(C#3.5,控制台项目)。您的示例在Silverlight 4应用程序中也能完美编译。是的,这很奇怪。它确实抛出过一次错误,但此后一直运行良好。奇怪。我将此问题标记为已结束。如果消费代码只希望分配一个要调用的委托,那么这将很好。结果表明原始代码。正确的方法是使用“通知?.Invoke(this,eventArgs);”或者“EventHandler=Invoke;if(handler!=null)handler(this,eventArgs);”确保在null检查和实际调用事件处理程序之间的另一个线程删除处理程序时,不会调用null处理程序。
public class ParentPage : Page
{
    IDynamicUI selectedUI = null;

    //fires when the ChildContent frame loads a child page...
    private void ChildContentFrame_Navigated(object sender, NavigationEventArgs e)
    {
        object childPage = ChildContentFrame.Content;
        this.selectedUI = (IDynamicUI)childPage;
        this.selectedUI.OnError += new EventHandler(ChildPage_OnError);
    }

    private void ChildPage_OnError(object sender, ErrorEventArgs e)
    {
        //do my error handling here.
    }
}
public interface IInform
{
    event EventHandler Inform;
    void InformNow();
}
public class ImplementInform : IInform
{
    public event EventHandler Inform;

    public void InformNow()
    {
        OnInformed(new EventArgs());
    }

    private void OnInformed(EventArgs eventArgs)
    {
        if (Inform != null)
        {
            Inform(this, eventArgs);
        }
    }
}
   static void Main(string[] args)
    {
        IInform objInform = new ImplementInform();
        objInform.Inform +=new EventHandler(Informed);
        objInform.InformNow();
        Console.ReadLine();
    }

    private static void Informed(object sender, EventArgs e)
    {
        Console.WriteLine("Informed");
    }