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

ls251544415 2011-05-17 07:58:01
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));

}
...全文
249 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
嘶吼的蚂蚁 2012-09-01
  • 打赏
  • 举报
回复
1楼正解!~
zhaoerbao 2012-08-01
  • 打赏
  • 举报
回复
fallincloud 2011-05-23
  • 打赏
  • 举报
回复
可能没拷贝完整,有什么疑问再问。
fallincloud 2011-05-23
  • 打赏
  • 举报
回复
用就是通过

RoutedEventArgs arg = new RoutedEventArgs(Window1.PrepareToSleepEvent);
this.RaiseEvent(arg);
来用
fallincloud 2011-05-23
  • 打赏
  • 举报
回复
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.

}
ls251544415 2011-05-19
  • 打赏
  • 举报
回复
回1楼:
能不能上一个能够通过的例子呢
houyanjun 2011-05-18
  • 打赏
  • 举报
回复
呵呵,,这个不是系统比你的代码额外用了什么。

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

你也可以做到这样的效果。但你必须监视操作系统消息(重写WndProc方法)

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧