C# 将事件附加到类
我正在尝试向主页.xaml.cs注册一个事件,如下所示: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
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;
,useMainPage.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。谢谢,这真的很有帮助!我会注意你的警告。