C# 将事件附加到类

C# 将事件附加到类,c#,events,event-handling,windows-phone,C#,Events,Event Handling,Windows Phone,我正在尝试向主页.xaml.cs注册一个事件,如下所示: public partial class MainPage : PhoneApplicationPage { public static ICanvas CurrentCanvas; private void MainPage_Loaded(object sender, RoutedEventArgs e) { //HERE I TRY TO REGISTER FOR MY EVENT ((WP8Canv

我正在尝试向主页.xaml.cs注册一个事件,如下所示:

public partial class MainPage : PhoneApplicationPage
{

public static ICanvas CurrentCanvas;


private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {

    //HERE I TRY TO REGISTER FOR MY EVENT

    ((WP8Canvas)CurrentCanvas).Redraw += WP8EventHandler_RedrawCanvas;

    //HERE I TRY TO REGISTER FOR MY EVENT/

    System.Threading.ThreadStart start = new System.Threading.ThreadStart(launchProcessA);
    System.Threading.Thread t = new System.Threading.Thread(start);
    t.Name = "ProcessA Thread";
    t.Start();

    }

    /// <summary>
    /// Listen to WP8Canvas repaint() methods
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void WP8EventHandler_RedrawCanvas(object sender, EventArgs e)
    {
        wpCanvas.InvalidateArrange();
        Debug.WriteLine("Redraw Canvas Event"); 
    }

}
public部分类主页:PhoneApplicationPage
{
公共静态ICanvas当前画布;
已加载私有void主页(对象发送方、路由目标)
{
//在这里,我尝试注册我的活动
((WP8Canvas)CurrentCanvas).Redraw+=WP8EventHandler\u RedrawCanvas;
//在这里,我尝试注册我的活动/
System.Threading.ThreadStart=新的System.Threading.ThreadStart(启动进程A);
System.Threading.Thread t=新的System.Threading.Thread(开始);
t、 Name=“ProcessA线程”;
t、 Start();
}
/// 
///听WP8Canvas repaint()方法
/// 
/// 
/// 
public void WP8EventHandler_重绘画布(对象发送方,EventArgs e)
{
wpCanvas.InvalidateArrange();
WriteLine(“重画画布事件”);
}
}
WP8Canvas.cs

public class WP8Canvas : WP8Displayable, ICanvas
{
    public Canvas canvas ;
    public event EventHandler Redraw;
    protected object reference;


    public WP8Canvas(object reference)
    {
        this.reference = reference;
        MainPage.CurrentCanvas = this;
        Debug.WriteLine("WP8Canvas instance");
    }

    public void repaint()
    {            
        RedrawCanvas();
    }

    /// <summary>
    /// Raise event if repaint() method is hit
    /// </summary
    private void RedrawCanvas()
    {
        //Null check makes sure the main page is attached to the event
        if (this.Redraw != null)
            this.Redraw(new object(), new EventArgs());
    }

}
公共类WP8Canvas:WP8Displayable,ICanvas
{
公共画布;
公共事件事件处理程序重画;
受保护对象引用;
公共WP8Canvas(对象引用)
{
this.reference=参考;
MainPage.CurrentCanvas=这个;
WriteLine(“WP8Canvas实例”);
}
公共无效重绘()
{            
重画画布();
}
/// 
///如果命中repaint()方法,则引发事件

///如果您无法控制
启动进程a
,则实现此结果的方法是使用以下属性:

public WP8Canvas CurrentWP8Canvas
{
    get
    {
        return this.CurrentCanvas as WP8Canvas;
    }

    set
    {
        this.CurrentCanvas = value;
        value.Redraw += WP8EventHandler_RedrawCanvas;
    }    
}
然后您只需更改代码,以便线程分配
CurrentWP8Canvas
属性,而不是
CurrentCanvas

编辑:如果需要它是静态的,一种方法是将事件处理程序存储在临时静态变量中:

public static EventHandler RedrawCanvas { get; set; }
然后从主页的构造函数设置它:

RedrawCanvas = WP8EventHandler_RedrawCanvas;
最后,将CurrentWP8Canvas声明为静态,并分配存储的事件处理程序:

public static WP8Canvas CurrentWP8Canvas
{
    get
    {
        return CurrentCanvas as WP8Canvas;
    }

    set
    {
        CurrentCanvas = value;
        value.Redraw += RedrawCanvas;
    }    
}

它应该工作。然而,它是非常错误的,因为很多原因:线程同步问题,内存泄漏的风险…在这一点上,你应该得出结论,你已经到达死胡同,回溯,并考虑重新设计你的体系结构。

< P>如果你不能控制<代码> RunCuffPaltua<代码>,那么就有办法达到这个目的。它是使用一个属性:

public WP8Canvas CurrentWP8Canvas
{
    get
    {
        return this.CurrentCanvas as WP8Canvas;
    }

    set
    {
        this.CurrentCanvas = value;
        value.Redraw += WP8EventHandler_RedrawCanvas;
    }    
}
然后您只需更改代码,以便线程分配
CurrentWP8Canvas
属性,而不是
CurrentCanvas

编辑:如果需要它是静态的,一种方法是将事件处理程序存储在临时静态变量中:

public static EventHandler RedrawCanvas { get; set; }
然后从主页的构造函数设置它:

RedrawCanvas = WP8EventHandler_RedrawCanvas;
最后,将CurrentWP8Canvas声明为静态,并分配存储的事件处理程序:

public static WP8Canvas CurrentWP8Canvas
{
    get
    {
        return CurrentCanvas as WP8Canvas;
    }

    set
    {
        CurrentCanvas = value;
        value.Redraw += RedrawCanvas;
    }    
}

它应该工作。但是,它是非常错误的,因为很多原因:线程同步问题,内存泄漏的风险……在那一点上,你应该得出结论,你已经到达死胡同,回溯,并考虑重新设计你的体系结构。< /P>你为什么不在<代码>启动过程中订阅你的事件?WP8Canvas已被实例化?

launchProcessA
类似于“导入”的代码。我不确定此代码是否会要求创建
WP8Canvas
。因此,我无法自动订阅此进程中的事件。我的想法更像是这样:创建
WP8Canvas
时,他只需告诉
MainPage
:“嘿,现在听听我的重画事件!”。但我不知道这是否可行。为什么不在WP8Canvas实例化之后立即在
launchProcessA
方法中订阅事件?
launchProcessA
类似于“导入”“代码。我不确定此代码是否会要求创建
WP8Canvas
。因此,我无法在此过程中自动订阅事件。我的想法更像是:创建
WP8Canvas
时,他只需告诉
主页
:“嘿,现在听听我的重画事件!”。但我不知道这是否可行。我正试图使用你的答案,但我在
WP8Canvas
的构造函数中使用
this
分配我的
CurrentCanvas
。我不知道如何在你的示例中分配。无论如何,我真的很感谢你的帮助,而不是你。@Yann代替
MainPage.CurrentCanvas=this;
,use
MainPage.CurrentWP8Canvas=this;
不幸的是,我不能这样做,因为
CurrentWP8Canvas
不能是静态的,因为它是一个属性,如果我通过
MainPage
实例调用它,就像这样:
MainPage instanceMainPage=newmainpage()
instanceMainPage.CurrentWP8Canvas=this;
,我获得了一个System.UnauthorizedAccessException。谢谢,这真的很有帮助!我会注意你的警告。我正在尝试使用你的答案,但我使用
this
WP8Canvas
的构造函数中指定了我的
CurrentCanvas
。我不知道怎么做在您的示例中使用了e分配。无论如何,我真的很感谢您的帮助,而不是您。@Yann不要使用
MainPage.CurrentCanvas=this;
,而是使用
MainPage.CurrentWP8Canvas=this;
不幸的是,我不能这样做,因为
CurrentWP8Canvas
不能是静态的,因为它是一个属性,如果我通过
MainPage
调用它,我就不能这样做像这样的情况:
MainPage instanceMainPage=new MainPage();
instanceMainPage.CurrentWP8Canvas=this;
,我获得了一个System.UnauthorizedAccessException。谢谢,这真的很有帮助!我会注意你的警告。