WPF 自定义路由事件简单实现
一、首先创建一个WPF项目,在项目中添加一个用户控件;
用户控件的xaml代码:
<UserControl x:Class="WpfApp19.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp19"
mc:Ignorable="d"
d:DesignHeight="120" d:DesignWidth="120">
<Grid Background="AliceBlue">
<Border BorderBrush="Green" BorderThickness="1"/>
<StackPanel>
<Button Name="btn_Test" Height="30" Width="100" Margin="0 10 0 10" Content="Test" Click="Btn_Test_Click"/>
<TextBox Height="60" Width="100"/>
</StackPanel>
</Grid>
</UserControl>
后台代码,这里面已经定义好一个自定义路由事件,单击控件中的按钮会触发这个路由事件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 WpfApp19
{
/// <summary>
/// MyUserControl.xaml 的交互逻辑
/// </summary>
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
//1、声明并注册路由事件,使用冒泡策略
public static readonly RoutedEvent MyRountEvent = EventManager.RegisterRoutedEvent("MyRountEventHandler",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
//2、通过.NET事件包装路由事件
public event RoutedEventHandler MyRountEventHandler
{
add
{
AddHandler(MyRountEvent, value);
}
remove
{
RemoveHandler(MyRountEvent, value);
}
}
//3、使用按钮的单击事件激发路由事件
private void Btn_Test_Click(object sender, RoutedEventArgs e)
{
RoutedEventArgs arg = new RoutedEventArgs();
arg.RoutedEvent = MyRountEvent;
RaiseEvent(arg);
}
}
}
自定义控件效果:
二、主窗体xaml代码:
并启用自定义的路由事件;
<Window x:Class="WpfApp19.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp19"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="450">
<Grid>
<local:MyUserControl MyRountEventHandler="RouteEventControl_Click" Width="120" Height="120"></local:MyUserControl>
</Grid>
</Window>
后台代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 WpfApp19
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void RouteEventControl_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hello:" + e.Source.ToString());
}
}
}
运行效果:
单击Test按钮,弹出提示。