本节课我们将演示附加事件的用法。假定我们有一个自定义控件,实时显示公司的销售额,在达到公司的既定销售目标后,每增加50万的业绩并触发一个事件,表示可以发绩效奖金啦。
我们修改一下《路由事件实战》中的Demo,在其中添加一个SalesManager类,并在类中定义一个附加事件。如下所示:
namespace HelloWorld.MVVM
{
public class SalesManager
{
public static readonly RoutedEvent CheckEvent = EventManager.RegisterRoutedEvent(
"CheckEvent",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(SalesManager));
public static void AddCheckHandler(DependencyObject dependencyObject, RoutedEventHandler handler)
{
if (dependencyObject is UIElement uiElement)
{
uiElement.AddHandler(CheckEvent, handler);
}
}
public static void RemoveCheckHandler(DependencyObject dependencyObject, RoutedEventHandler handler)
{
if (dependencyObject is UIElement uiElement)
{
uiElement.RemoveHandler(CheckEvent, handler);
}
}
}
}
在上面的代码中,我们定义了一个CheckEvent路由事件,并通过AddCheckHandler添加到事件系统中。然后在主窗体的XMAL代码中去使用这个Check附加事件。
<controls:Widget Value="{Binding ElementName=slider,Path=Value}"
Target="1000000"
Completed="Widget_Completed"
helper:SalesManager.Check="Widget_Check"
Title="第四季度北美市场总销售额统计"
Canvas.Left="116" Canvas.Top="17"
Height="103" Width="269"/>
请注意,在使用前引入SalesManager的命名空间
xmlns:helper="clr-namespace:HelloWorld.MVVM"
在前面的课程中,Widget控件的Completed事件表示完成销售目标是引发的事件,所以,我们要在这个事件里去引发SalesManager.Check附加事件,因为题目已设定必须是完成了销售目标后,每增加50万业绩才发奖金。
private void Widget_Completed(object sender, RoutedEventArgs e)
{
Widget widget = sender as Widget;
listBox.Items.Insert(0, $"完成目标销售额:{widget.Value}");
widget.RaiseEvent(new RoutedEventArgs(SalesManager.CheckEvent));
}
private void Widget_Check(object sender, RoutedEventArgs e)
{
Widget widget = sender as Widget;
if (((int)widget.Value) % 500000 < 5000)
{
listBox.Items.Insert(0, $"当前业绩:{widget.Value},每累计50万发奖金啦:{widget.Value*0.5}");
}
}
所以,我们在Widget_Completed回调函数中,让widget自己去引发它的附加事件。并在Widget_Check回调函数中去判断当前的业绩有没有增加到50万。当然这里只是写了一个判断的伪代码。最后我们运行一下本程序,拖动Slider控件,模拟销售业绩的增长,以观察结果。
当前课程源码下载:(注明:本站所有源代码请按标题搜索)
文件名:088-《附加事件实战》-源代码.rar
链接:https://pan.baidu.com/s/1yu-q4tUtl0poLVgmcMfgBA
提取码:wpff
——重庆教主 2023年10月27日