events handle
routed event:
UIElement(all elements inherits from);bubble(冒泡,up to root element),tunnel(隧道,down from root element);
void Handle_RoutedEvent(object sender, RoutedEventArgs e) RoutedEventArgs derives from EventArgs,includes extra information that WPF uses to work its magic;
Properties Specific to RoutedEventArgs
Name | Description |
Source | The object that raised the event. This is a property you will generally be interested in. It’s useful to note that with routed events this is likely to be different from the sender. |
OriginalSource | This returns original reporting source. That is the object that really raised the event. This property does not change as the event travels along its route. |
Handled | A bool that lets you know if the event has already been handled. You should mark this true in your own handlers. |
RoutedEvent | This identifies the type of event that was raised. Many events have the same signature, and a single handler might be responsible for several events. |
通过 e.Handled = true; 显式中止路由链上的二次触发(见 附件1);
使用场景
building (or compositing) your own custom controls;
attached event(works like attached property)
如
ButtonBase.Click=”StackPanel_Click”
常规格式为Type.EventName,Type is the name of the class that owns the event(见 附件2);
对TextEditor的再完善
<local:TextEditorToolbar x:Name="toolbar"
DockPanel.Dock="Top"
ComboBox.SelectionChanged="TextEditorToolbar_SelectionChanged" />
//MainWindow.xaml.cs
private void TextEditorToolbar_SelectionChanged(object sender,SelectionChangedEventArgs e)
{
//e is a routed event,use OriginalSource to get a reference to the ComboBox
ComboBox source = e.OriginalSource as ComboBox;
if (source == null) return;
switch (source.Name)
{
case "fonts”:
//change the font face break;
case "fontSize”:
//change the font size break;
}
body.Focus();
}
Action<T>
delegate void Action<T>(T obj);
Preview Events
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace PreviewEvents {
public partial class Window1
{
public Window1()
{
InitializeComponent();
}
private void Handler(object sender, KeyEventArgs e)
{
bool isPreview = e.RoutedEvent.Name.StartsWith("Preview");
string direction = isPreview ? "v" : "^";
Output.Items.Add(string.Format("{0} {1}", direction, sender.GetType().Name));
if (sender == e.OriginalSource && isPreview)
Output.Items.Add("-{bounce}-");
if (sender == this && !isPreview)
Output.Items.Add("-end-");
}
}
}
详见 附件3;
小记:
WPF,a set of composite UI elements;
事件,可写代码的外链接;
路由事件,在wpf中获得了超越普通事件的扩展和增强。