当前位置:编程学习 > C#/ASP.NET >>

自定义事件的问题【WPF,诚心请教】

WPF中自定义了一个事件,必须调用触发方法才能响应事件


但是问题在于,为什么:
我在使用系统类的事件时,事件能成功响应(不用关注触发方法)
而在使用自定义的事件时,非得显式调用触发方法才能响应事件


我的目的就是:
能像使用系统事件一样,不用关注触发方法就能使用事件,请问怎么实现这个目的?
我所知的是,系统类得事件全都用以  On开头+事件名  的方法触发事件(例如:OnClick()引发Click事件)


诚心求教各位高手指点一二,小弟感激不尽





using System.Windows;
using System.Windows.Controls;

public partial class FullNameText : TextBlock
{



public FullNameText()
{
this.IsMappingChanged += new RoutedEventHandler(FullNameText_IsMappingChanged);
this.Loaded+=new RoutedEventHandler(FullNameText_Loaded);

//这个是触发自定义事件的方法,注释后,IsMappingChanged事件得不到响应
//RaiseEvent(new RoutedEventArgs(FullNameText.IsMappingChangedEvent);
}


//这个事件不能触发
private void FullNameText_IsMappingChanged(object sender, RoutedEventArgs e)
{
MessageBox.Show("触发自定义事件");
}

//这个事件可以触发
private void FullNameText_Loaded(object sender, RoutedEventArgs e)
{
MessageBox.Show("触发系统事件");
}




//属性
public bool IsMapping
{
get { return (bool)this.GetValue(IsMappingProperty); }
set { this.SetValue(IsMappingProperty, value); }
}

//事件
public event RoutedEventHandler IsMappingChanged
{
add { this.AddHandler(FullNameText.IsMappingChangedEvent, value); }
remove { this.RemoveHandler(FullNameText.IsMappingChangedEvent, value); }
}









// 注册IsMappingChanged事件
public static readonly RoutedEvent IsMappingChangedEvent = 
EventManager.RegisterRoutedEvent
("IsMappingChanged",
RoutingStrategy.Direct,
typeof(RoutedEventHandler),
typeof(FullNameText));


// 注册IsMapping属性
public static DependencyProperty IsMappingProperty = 
DependencyProperty.Register
("IsMapping", 
typeof(bool),
typeof(FullNameText), 
new PropertyMetadata(false));

}
--------------------编程问答-------------------- 呵呵,,这个不是系统比你的代码额外用了什么。

比如button点击事件。系统的button控件,系统已经做好了类,在这个类里面就有点击对应的函数,它有写一个函数用于监视操作系统的消息,如果操作系统发生了click事件,而且坐标位置落在了这个按钮的范围内,则执行event链中的函数。

你也可以做到这样的效果。但你必须监视操作系统消息(重写WndProc方法) --------------------编程问答-------------------- 回1楼:
能不能上一个能够通过的例子呢 --------------------编程问答--------------------
public static readonly  RoutedEvent PrepareToSleepEvent;
static Window1()
{
PrepareToSleepEvent = EventManager.RegisterRoutedEvent("PrepareToSleep", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Window1));
}

public event RoutedEventHandler PrepareToSleep
{
add { AddHandler(Window1.PrepareToSleepEvent, value); }
remove { RemoveHandler(Window1.PrepareToSleepEvent, value);}
}

public Window1()
{
InitializeComponent();
SystemEvents.PowerModeChanged +=new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
this.Awake += (o, e) => { PrepareToSleep(); };
}

private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
if (e.Mode == PowerModes.Suspend)
{
RoutedEventArgs arg = new RoutedEventArgs(Window1.PrepareToSleepEvent);
this.RaiseEvent(arg); 
}
}

private void PrepareToSleep()
{

// do something.

}
--------------------编程问答-------------------- 用就是通过

       RoutedEventArgs arg = new RoutedEventArgs(Window1.PrepareToSleepEvent);
                this.RaiseEvent(arg); 
来用 --------------------编程问答-------------------- 可能没拷贝完整,有什么疑问再问。 --------------------编程问答-------------------- --------------------编程问答-------------------- 1楼正解!~
补充:.NET技术 ,  .NET技术前瞻
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,