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

本文关键字:声明 事件处理 程序 接口 | 更新日期: 2023-09-27 18:11:58

我有一些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; }
}

但是编译器告诉我不能在公共接口中声明字段。

问题是,应该实现这一点的页面托管在一个导航框架内,采用SL4导航框架。这很好,但是,我还需要能够将子页面中发生的事件(如错误)传递到父页面。更重要的是,我希望能够基于在父页面中发生的事件强制刷新子页面UI。

为了避免使用反射(查看导航面板中显示的页面类型),我只想从中提取iddynamic UI。这将允许我做这样的事情:

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.
    }
}

对于所有MVVM/MVC的粉丝…不是这样的。我知道,如果采用MVVM方法来制作这款游戏,它会变得容易得多,但应用程序已经编写好了,我不打算从头开始重写。(

谢谢马丁

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

创建接口IInform

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

输出:通知

尝试将其定义为event Action<ErrorEventArgs> OnError;