1

我正在尝试向MainPage.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"); 
    }

}

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但当然会发生空异常。我的Thread t控制着WP8Canvas对象的创建,但这发生在运行时,我不知道什么时候。

问题:如何在不遇到空指针异常的情况下将我的 WP8Canvas Redraw 事件注册到MainPage 。

4

1 回答 1

1

如果您无法控制launchProcessA,那么达到此结果的一种方法是使用属性:

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

然后从 MainPage 的构造函数中设置它:

RedrawCanvas = WP8EventHandler_RedrawCanvas;

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

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

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

它应该工作。然而,这是非常错误的,原因有很多:线程同步问题、内存泄漏风险……到那时,你应该得出结论,你已经走到了死胡同,回溯,并考虑重新设计你的架构。

于 2013-09-09T09:07:48.307 回答