iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >WPF路由事件中的三种策略介绍
  • 899
分享到

WPF路由事件中的三种策略介绍

2024-04-02 19:04:59 899人浏览 八月长安
摘要

什么是路由事件 路由事件是具有更强传播能力的事件,它可以在元素树中向上冒泡和向下隧道传播,并且能够沿着传播路径被事件处理程序来处理。 路由事件允许事件在某个元素上被处理,即使这个事件

什么是路由事件

路由事件是具有更强传播能力的事件,它可以在元素树中向上冒泡和向下隧道传播,并且能够沿着传播路径被事件处理程序来处理。

路由事件允许事件在某个元素上被处理,即使这个事件源自于另外一个元素。事件路由允许某个元素的事件由另外一个元素引发。

路由事件是一种可以针对元素树中的多个侦听器而不是仅仅针对引发该事件的对象调用处理程序的事件。路由事件是一个CLR事件。

路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件,当路由事件触发后,它可以向上或向下遍历可视树和逻辑树,他用一种简单而持久的方式在每个元素上触发,而不需要任何定制的代码(如果用传统的方式实现一个操作,执行整个事件的调用则需要执行代码将事件串联起来)。

路由事件的路由策略:

所谓的路由策略就是指:路由事件实现遍历元素的方式。

路由事件一般使用以下三种路由策略:

  • 冒泡路由事件:冒泡路由事件在包含层次中向上传递,即由事件源向上传递一直到根元素。
  • 直接路由事件:直接路由事件与普通的.net事件是非常相似的,他们都起源于一个元素,并且不能够传递给其它的元素。 只有事件源才有机会响应事件。
  • 隧道路由事件:从元素树的根部调用事件处理程序并依次向下深入直到事件源。一般情况下,WPF提供的输入事件都是以隧道/冒泡对实现的。隧道事件常常被称为Preview事件。

1、冒泡路由事件

XAML代码如下:

<Window x:Class="WpfRouteEventByBubble.MainWindow"
        xmlns="Http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="190" Width="246" windowstartupLocation="CenterScreen">
    <Grid x:Name="GridRoot" Background="Lime">
        <Grid x:Name="GridA" Margin="10" Background="Blue">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <canvas x:Name="CanvasLeft" Grid.Column="0" Background="Red" Margin="10">
                <Button x:Name="ButtonLeft" Width="65" Height="100" Margin="10" Content="Left"></Button>
            </Canvas>
            <Canvas x:Name="CanvasRight" Grid.Column="1" Background="Yellow" Margin="10">
                <Button x:Name="ButtonRight" Width="65" Height="100" Margin="10" Content="Right"></Button>
            </Canvas>
        </Grid>
    </Grid>
</Window>

运行效果如下所示:

当单击Left按钮的时候,Button.Click事件被触发,并且沿着ButtonLeft→CanvasLeft→GridA→GridRoot→Window这条路线向上传递,当单击Right按钮就会沿着ButtonRight→CanvasRight→GridA→GridRoot→Window这条路线向上传递,这里还没有添加监听器,所以是没有反应的。

如何加入监听器,我们可以再XAML中添加,XAML代码如下:

<Window x:Class="WpfRouteEventByBubble.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="190" Width="246" WindowStartupLocation="CenterScreen">
    <Grid x:Name="GridRoot" Background="Lime" Button.Click="Button_Click">
        <Grid x:Name="GridA" Margin="10" Background="Blue" Button.Click="Button_Click">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Canvas x:Name="CanvasLeft" Grid.Column="0" Background="Red" Margin="10" Button.Click="Button_Click">
                <Button x:Name="ButtonLeft" Width="65" Height="100" Margin="10" Content="Left" Button.Click="Button_Click"></Button>
            </Canvas>
            <Canvas x:Name="CanvasRight" Grid.Column="1" Background="Yellow" Margin="10" Button.Click="Button_Click">
                <Button x:Name="ButtonRight" Width="65" Height="100" Margin="10" Content="Right" Button.Click="Button_Click"></Button>
            </Canvas>
        </Grid>
    </Grid>
</Window>

我们在XAML代码中添加了Button.Click="Button_Click"这个事件处理器,就是监听器,并且事件处理交由Button_Click负责,后台Button_Click代码如下:

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 WpfRouteEventByBubble
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("我到达了:" + (sender as FrameworkElement).Name);
        }
    }
}

我们分析一下,那两个参数到底是什么呢?

  • 参数一:sender,这是听者,就是监听的地方,如果点击了Left按钮,那么Left按钮就会大声说:“我被点击了”这个事件向上传递,知道到了设有监听Button.Click事件的地方,这个地方就是sender。
  • 参数二:是RoutEventArgs类型的,这个参数携带了一些重要信息,例如事件是从哪里来的,上一个传到哪里等,都可以利用这个参数来查询。

运行效果如下:

我们会发现,当点击button按钮时,ButtonLeft、CanvasLeft、GridA、GridRoot中的事件都会触发,这就是冒泡路由策略的功能所在,事件首先在源元素上触发,然后从每一个元素向上沿着树传递,直到到达根元素为止(或者直到处理程序把事件标记为已处理为止),从而调用这些元素中的路由事件。

如果把Button_Click事件修改为:

 private void Button_Click(object sender, RoutedEventArgs e)
 {
        MessageBox.Show("我到达了:" + (sender as FrameworkElement).Name);
        e.Handled = true;//让事件停止冒泡
}

则以上事件就不会沿着ButtonLeft→CanvasLeft→GridA→GridRoot→Window这条路线传递下去,只会执行ButtonLeft的事件。

MouseUp就是一个冒泡路由事件,看下面的XAML代码:

<Window x:Class="路由事件.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:路由事件"
        mc:Ignorable="d"
        Title="冒泡路由事件" Height="596" Width="886"
        MouseUp="SomethinGClicked" WindowStartupLocation="CenterScreen">
    <Grid Margin="3" MouseUp="SomethingClicked">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>

        <Label Margin="5" Background="AliceBlue" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" MouseUp="SomethingClicked">
            <StackPanel MouseUp="SomethingClicked">
                <TextBlock Margin="3" MouseUp="SomethingClicked">
                    Image and picture lable
                </TextBlock>
                <Image Source="E:\practice\WPF\WPFDemo\路由事件\Image\face.jpeg" Stretch="None" MouseUp="SomethingClicked"></Image>
                <TextBlock Margin="3" MouseUp="SomethingClicked">
                   Courtesy of the StackPanel
                </TextBlock>
            </StackPanel>
        </Label>

        <ListBox Margin="5" Name="lstMessage" Grid.Row="1"></ListBox>
        <CheckBox Margin="5" Grid.Row="2" Name="chkHandle">Handle first event</CheckBox>
        <Button Click="cmdClear_click" Grid.Row="3" HorizontalAlignment="Right" Margin="5" Padding="3">Clear List</Button>
    </Grid>
</Window>

当我们点击Image的时候,发发生冒泡路由事件,会一层层的向外传递,传递顺序:Image->StackPanel->Label->Grid->Window

后端代码如下:

using System.Windows;

namespace 路由事件
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        protected int eventCounter = 0;
        private void SomethingClicked(object sender, RoutedEventArgs e)
        {
            eventCounter++;
            string message = $"#{eventCounter.ToString()}:\r\n" +
                $"Sender:{sender.ToString()}\r\n" +
                $"Source:{e.Source}\r\n" +
                $"Original Source:{e.OriginalSource}";
            lstMessage.Items.Add(message);
            // Handled允许终止事件的冒泡或者终止隧道过程
            // 设置Handled=True,事件就不会继续传递了
            e.Handled = (bool)chkHandle.IsChecked;
        }

        private void cmdClear_click(object sender, RoutedEventArgs e)
        {
            eventCounter = 0;
            lstMessage.Items.Clear();
        }
    }
}

运行程序,输出结果如下:

可以看到:输出结果就是按照我们上面的顺序输出的。我们把Grid的MouseUp事件去掉,在看输出结果:

这时就没有Grid控件了。勾选下面的复选框,在执行结果:

这时只有Image控件被触发了,其它控件的MouseUp被终止了。

2、隧道路由事件

隧道路由事件跟冒泡路由事件一样,都是在包含层次中,但是隧道路由事件的传递方向跟冒泡路由事件正好相反:隧道路由事件首先是从根元素上被触发,然后从每一个元素向下沿着树传递,直到到达根元素为止(或者直到到达处理程序把事件标记为已处理为止)。

冒泡路由事件是向上传递,隧道路由事件是向下传递。

隧道路由事件在事件到达恰当的控件之前,为预览事件提供了机会。首先是在窗口级别上,也就是顶级,然后是更具体的容器,最后直到到达按下键时具有焦点的元素。我们很容易就可以识别隧道事件,因为他们都是以单词Preview开头的。WPF通常可以成对的定义冒泡路由事件和隧道路由事件。如果我们找到一个MouseUp的冒泡路由事件,还可以找到一个PreviewMouseUp的隧道路由事件。隧道路由事件总是在冒泡路由事件之前被触发。

XAML代码如下;

<Window x:Class="Wpf路由事件管道策略.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" WindowStartupLocation="CenterScreen" PreviewMouseDown="Window_PreviewMouseDown">
    <Grid x:Name="grid" PreviewMouseDown="grid_PreviewMouseDown">
        <Button Height="30" Width="100" Content="点击我" PreviewMouseDown="Button_PreviewMouseDown"></Button>
    </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 Wpf路由事件管道策略
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("windows被点击");
        }

        private void grid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("grid被点击");
        }

        private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("button被点击");
        }
    }
}

程序运行效果:

特别值得注意的是:管道事件按照惯例,他们的名字中都有一个preview前缀,一般来说管道事件都有他的配对的冒泡事件,例如:PreviewMouseDown和MouseDown就是配对事件,如果同时存在的话,那么就会先执行管道事件然后才执行配对的冒泡事件。当然e.Handled=true,依然能够阻断事件。

看下面的示例代码:

<Window x:Class="路由事件.Window1"
        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:路由事件"
        mc:Ignorable="d"
        Title="隧道路由事件" Height="639" Width="853"
        PreviewKeyDown="SomeKeyPressed">
    <Grid Margin="3" PreviewKeyDown="SomeKeyPressed">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>

        <Label Margin="5" Background="AliceBlue" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Stretch" PreviewKeyDown="SomeKeyPressed">
            <StackPanel PreviewKeyDown="SomeKeyPressed">
                <TextBlock Margin="3" HorizontalAlignment="Center" PreviewKeyDown="SomeKeyPressed">
                    Image and picture lable
                </TextBlock>
                <Image Source="E:\practice\WPF\WPFDemo\路由事件\Image\face.jpeg" HorizontalAlignment="Center" Stretch="None" PreviewKeyDown="SomeKeyPressed"></Image>

                <DockPanel Margin="0,5,0,0" PreviewKeyDown="SomeKeyPressed">
                    <TextBlock Margin="3" PreviewKeyDown="SomeKeyPressed">
                       Type here:
                    </TextBlock>
                    <TextBox PreviewKeyDown="SomeKeyPressed"></TextBox>
                </DockPanel>
            </StackPanel>
        </Label>

        <ListBox Margin="5" Name="lstMessage" Grid.Row="1"></ListBox>
        <CheckBox Margin="5" Grid.Row="2" Name="chkHandle">Handle first event</CheckBox>
        <Button Click="cmdClear_click" Grid.Row="3" HorizontalAlignment="Right" Margin="5" Padding="3">Clear List</Button>
    </Grid>
</Window>

后端事件代码:

using System.Windows;

namespace 路由事件
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        protected int eventCounter = 0;

        private void SomeKeyPressed(object sender, RoutedEventArgs e)
        {
            eventCounter++;
            string message = $"#{eventCounter.ToString()}:\r\n" +
                $"Sender:{sender.ToString()}\r\n" +
                $"Source:{e.Source}\r\n" +
                $"Original Source:{e.OriginalSource}" +
                $"Event:{e.RoutedEvent}";
            lstMessage.Items.Add(message);
            // Handled允许终止事件的冒泡或者终止隧道过程
            // 设置Handled=True,事件就不会继续传递了
            e.Handled = (bool)chkHandle.IsChecked;
        }

        private void cmdClear_click(object sender, RoutedEventArgs e)
        {
            eventCounter = 0;
            lstMessage.Items.Clear();
        }
    }
}

运行结果:

可以看到:执行顺序是从顶级元素到最里层的元素。

注意:如果要使用冒泡路由事件,只需要将PreviewKeyDown改为KeyDown即可。

3、直接策略

事件仅仅在源元素上触发,这个与普通的.Net事件的行为相同,不同的是这样的事件仍然会参与一些路由事件的特定机制,如事件触发器等。

该事件唯一可能的处理程序是与其挂接的委托。 

路由事件的事件处理程序的签名(即方法的参数):

他与通用的.net事件处理程序的模式一致,也有两个参数:第一个为:System.Object对象,名为sender,第二个参数(一般名为e)是一个派生于System.EventArgs的类。sender参数就是该处理程序被添加的元素,参数e是RoutedEventArgs的一个实例提供了4个有用的属性:

  • Source---逻辑树中开始触发该事件的的元素。
  • originalSource--可视树中一开始触发该事件的元素。
  • handled---布尔值,设置为true表示事件已处理,在这里停止。
  • RoutedEvent---真正的路由事件对象,(如Button.ClickEvent)当一个事件处理程序同时用于多个路由事件时,它可以有效地识别被出发的事件。

以上所述是小编给大家介绍的WPF路由事件中的三种策略,希望对大家有所帮助。在此也非常感谢大家对编程网网站的支持!

--结束END--

本文标题: WPF路由事件中的三种策略介绍

本文链接: https://www.lsjlt.com/news/140583.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • WPF路由事件中的三种策略介绍
    什么是路由事件 路由事件是具有更强传播能力的事件,它可以在元素树中向上冒泡和向下隧道传播,并且能够沿着传播路径被事件处理程序来处理。 路由事件允许事件在某个元素上被处理,即使这个事件...
    99+
    2024-04-02
  • 详解WPF中的隧道路由和冒泡路由事件
    目录事件最基本的用法理解路由事件  WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由事件能更好的处理事件相关的逻辑,我们从这篇开始整理事件的用法和什么是直接路由,什...
    99+
    2024-04-02
  • WPF中隧道路由和冒泡路由事件的示例分析
    这篇文章主要介绍了WPF中隧道路由和冒泡路由事件的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由...
    99+
    2023-06-14
  • 计算机网络中路由策略和策略路由的区别有哪些
    这篇文章主要介绍计算机网络中路由策略和策略路由的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!区别:路由策略是通过修改路由表的路由条目来控制数据流量的可达性;而策略路由是通过用户制定的策略进行转发,且该策略...
    99+
    2023-06-14
  • WPF自定义路由事件的实例教程
    目录路由事件模型【分析代码】【自定义路由事件】总结路由事件模型 传统的简单事件模型中,在消息激发是将消息通过事件订阅的然后交给事件的相应者,事件的相应者使用事件的处理器来做出相应,这...
    99+
    2024-04-02
  • WPF自定义路由事件的示例分析
    这篇文章主要为大家展示了“WPF自定义路由事件的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“WPF自定义路由事件的示例分析”这篇文章吧。一、声明路由事件变量并注册定义只读的静态变量字段...
    99+
    2023-06-29
  • Python中三种条件语句示例介绍
    目录ifif…elseif…elif…else总结if """ 条件语句: if if...else if...elif...else i...
    99+
    2024-04-02
  • PHP中灵活运用不同的路由策略
    引言:在开发一个Web应用程序时,路由是一个非常重要的概念。它决定了如何将请求映射到相应的处理程序,以及如何组织和管理应用程序的URL结构。在PHP中,我们可以通过使用不同的路由策略来实现更加灵活和高效的路由。1.原始路由策略:在早期的PH...
    99+
    2023-10-21
    PHP 路由策略 灵活运用
  • ASP 中常用的并发控制策略介绍
    在 ASP(Active Server Pages)应用程序中,由于多个用户同时访问同一个资源,容易导致数据冲突,因此并发控制是一个必不可少的问题。本文将介绍 ASP 中常用的并发控制策略。 乐观锁 乐观锁是一种乐观的并发控制策略,它...
    99+
    2023-11-12
    并发 数据类型 编程算法
  • jQuery中的常用事件介绍
    一、jQuery事件的分类 jQuery事件是对JavaScript事件的封装,常用事件分类如下: 1、基础事件 window事件。鼠标事件。键盘事件。表单事件。 2、复合事件是多个...
    99+
    2024-04-02
  • React路由组件传参的三种方式(params、search、state)
    目录向路由组件传递params参数向路由组件传递search参数向路由组件传递state参数总结三种向路由组件传参的方式向路由组件传递params参数 当点击消息1这个导航链接时,展...
    99+
    2024-04-02
  • MySQL中的备份和恢复策略及最佳实践介绍
    MySQL是一种常用的关系型数据库管理系统,它广泛应用于Web应用程序和服务器。对于任何一个使用MySQL的组织或个人来说,备份和恢复数据是非常重要的。本文将介绍MySQL中的备份和恢复策略以及最佳实践。第一部分:备份策略备份是指将数据库的...
    99+
    2023-10-22
    策略 MySQL 恢复 备份 最佳实践
  • C++获取文件大小数值的三种方式介绍
    目录方式一方式二方式三总结方式一 推荐使用此方式获得文件大小! C/C++、Window、Linux 环境都可以使用! 通过结构体struct stat获得。 需要包含头文件:#in...
    99+
    2024-04-02
  • 深入了解SpringBoot中@ControllerAdvice的介绍及三种用法
    目录浅析@ControllerAdvice1.处理全局异常2.预设全局数据3.请求参数预处理浅析@ControllerAdvice 首先,ControllerAdvice本质上是一个...
    99+
    2023-02-06
    SpringBoot @ControllerAdvice用法 @ControllerAdvice用法 SpringBoot @ControllerAdvice
  • Vue路由模式中的hash和history模式详细介绍
    目录1. 路由概念2. hash模式3. history路由模式1. 路由概念 路由的本质就是一种对应关系,根据不同的URL请求,返回对应不同的资源。那么url地址和真实的资源之间就...
    99+
    2024-04-02
  • C#中的三种定时计时器Timer用法介绍
    在.NET中有三种计时器: 1、System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。Timer控件只有绑定了Tick事件和设置Enabl...
    99+
    2024-04-02
  • Java中获取键盘输入值的三种方法介绍
    程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,请你看以下三种解决...
    99+
    2023-05-30
    java 获取输入 ava
  • Python中删除文件的几种方法介绍
    本篇内容主要讲解“Python中删除文件的几种方法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中删除文件的几种方法介绍”吧!前言很多时候开发者需要删除文件。可能是他错误地创建了...
    99+
    2023-06-07
  • vue中的事件修饰符介绍和示例
    目录1. 官方文档2. 说明+实例2.1 .stop2.2 .prevent2.3 .capture2.4 {keyCode | keyAlias}2.5 .native2.6 .o...
    99+
    2023-05-17
    vue修饰符 vue事件修饰符
  • ABP框架中的事件总线功能介绍
    目录事件总线关于事件总线为什么需要这个东西事件总线创建过程订阅事件事件发布事件全局异常加入事件总线功能创建事件订阅事件发布事件测试记录事件事件总线 关于事件总线 ABP 中,为了方便...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作