• 【WPF】附加事件


    什么是附加事件

    Microsoft 官方概述:
      附加事件可用于在非元素类中定义新的 路由事件 ,并在树中的任何元素上引发该事件。 为此,必须将附加事件注册为路由事件,并提供支持附加事件功能的特定 支持代码 。 由于附加事件注册为路由事件,因此在元素树中引发时,它们会传播到元素树中。

    简单来说就是,可以进行附加操作的事件,必须为路由事件RoutedEvent)。

    附加事件用法

      在 XAML 语法中,附加事件由其 事件名称所有者 类型指定,格式为 .。 由于事件名称使用其所有者类型的名称进行限定,因此语法允许事件附加到任何可以实例化的元素。 此语法也适用于附加到事件路由中任意元素的常规路由事件的处理程序。

    Microsoft 官方文档

    这里简略的借用文档中的说明,详细学习请以文档为准:附加事件概述 (WPF .NET)

    附加事件案例

    定义自定义控件

    using System.Windows;
    using System.Windows.Controls;
    
    namespace assembly
    {
        /// 
        /// 按照步骤 1a 或 1b 操作,然后执行步骤 2 以在 XAML 文件中使用此自定义控件。
        ///
        /// 步骤 1a) 在当前项目中存在的 XAML 文件中使用该自定义控件。
        /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根
        /// 元素中:
        ///
        ///     xmlns:MyNamespace="clr-namespace:assembly"
        ///
        ///
        /// 步骤 1b) 在其他项目中存在的 XAML 文件中使用该自定义控件。
        /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根
        /// 元素中:
        ///
        ///     xmlns:MyNamespace="clr-namespace:assembly;assembly=assembly"
        ///
        /// 您还需要添加一个从 XAML 文件所在的项目到此项目的项目引用,
        /// 并重新生成以避免编译错误:
        ///
        ///     在解决方案资源管理器中右击目标项目,然后依次单击
        ///     “添加引用”->“项目”->[浏览查找并选择此项目]
        ///
        ///
        /// 步骤 2)
        /// 继续操作并在 XAML 文件中使用控件。
        ///
        ///     
        ///
        /// 
        public class MessagePopup : UserControl
        {
            public static readonly DependencyProperty BusinessTypeProperty =
             DependencyProperty.Register(nameof(BusinessType), typeof(string), typeof(MessagePopup), new PropertyMetadata(string.Empty));
            /// 
            /// 业务类型
            /// 
            public string BusinessType
            {
                get { return (string)GetValue(BusinessTypeProperty); }
                set { SetValue(BusinessTypeProperty, value); }
            }
    
            public static readonly DependencyProperty SecondsProperty =
                DependencyProperty.Register(nameof(Seconds), typeof(string), typeof(MessagePopup), new PropertyMetadata(string.Empty));
            /// 
            /// 秒数
            /// 
            public string Seconds
            {
                get { return (string)GetValue(SecondsProperty); }
                set { SetValue(SecondsProperty, value); }
            }
    
            static MessagePopup()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(MessagePopup), new FrameworkPropertyMetadata(typeof(MessagePopup)));
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 自定义控件样式

    下面的样式使用 ControlTemplate 自定义的控件样式,其中的 Button 按钮是不能进行事件绑定的,当然命令绑定也是不行的。

    <Application
        x:Class="assembly.App"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:assembly"
        StartupUri="MainWindow.xaml">
        <Application.Resources>
            <ResourceDictionary>
                
                <Style x:Key="popup" TargetType="{x:Type local:MessagePopup}">
                    "Height" Value="436" />
                    "Width" Value="840" />
                    "Template">
                        
                            "{x:Type local:MessagePopup}">
                                
                                    
                                        "pack://application:,,,/images/bg-Tips.png" />
                                    
                                    
                                        "0.7*" />
                                        "Auto" />
                                        
                                    
                                    "0" Margin="55,0">
                                        
                                            "0.5*" />
                                            
                                        
                                        
                                        "1"
                                            HorizontalAlignment="Center"
                                            VerticalAlignment="Center"
                                            Orientation="Horizontal">
                                            "42"
                                                FontWeight="Black"
                                                Text="" />
                                            "42"
                                                FontWeight="Black"
                                                Foreground="#F95A00"
                                                Text="{TemplateBinding BusinessType}" />
                                            "42"
                                                FontWeight="Black"
                                                Text="" />
                                        
                                    
                                    "1"
                                        Margin="80,0"
                                        Stroke="#8DB2BD"
                                        StrokeDashArray="2,2"
                                        StrokeThickness="4"
                                        X1="0"
                                        X2="650" />
                                    "2" Margin="55,0">
                                        
                                            
                                            
                                        
                                        "0" Margin="75,0">
                                            "0,30,0,0"
                                                VerticalAlignment="Center"
                                                Orientation="Horizontal">
                                                "Center"
                                                    FontSize="32"
                                                    Foreground="#002C86"
                                                    Text="" />
                                                "40"
                                                    Margin="20,0"
                                                    Source="pack://application:,,,/images/ico-arrow.png" />
                                                
                                            
                                        
                                        "1">
                                            "0,20,0,0"
                                                HorizontalAlignment="Center"
                                                VerticalAlignment="Center"
                                                Orientation="Horizontal">
                                                "38"
                                                    Foreground="#FFD873"
                                                    Text="{TemplateBinding Seconds}" />
                                                "38"
                                                    Foreground="#FFD873"
                                                    Text="" />
                                                "10,0,0,0"
                                                    VerticalAlignment="Bottom"
                                                    FontSize="32"
                                                    Foreground="#FFFFFF"
                                                    Text="" />
                                            
                                        
                                    
                                
                            
                        
                    
                Style>
                
            ResourceDictionary>
        Application.Resources>
    Application>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 效果

    在这里插入图片描述

    注册使用附加事件

    使用该自定义控件时,为其注册 Button.Click 事件,属于原生路由事件。对应其用方法可以得出,该事件触发的是 Button 元素的 Click 事件。

    简单来说就是,只有自定义控件中的 Button 元素才能触发当前的 Click 事件。(附加事件用法)

    <Window
        x:Class="assembly.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:comm="clr-namespace:assembly"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="900"
        Height="550"
        WindowStartupLocation="CenterScreen"
        mc:Ignorable="d">
        <Grid>
            <comm:MessagePopup
                x:Name="popup"
                Width="840"
                Height="436"
                Button.Click="popup_Click"
                Style="{StaticResource popup}"
                Visibility="Visible" />
        Grid>
    Window>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    元素树中声明了两个 Buuton 这里暂且通过 Button 的 Tag 值来区分,不仅限于 Tag。

    private void popup_Click(object sender, RoutedEventArgs e)
    {
        string tag = (string)((FrameworkElement)e.OriginalSource).Tag;
        if (tag == "0")
        {
            MessageBox.Show("是关闭按钮");
            //CloseTimer();
        }
        else if (tag == "1")
        {
            MessageBox.Show("是跳转按钮");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 效果

    在这里插入图片描述

  • 相关阅读:
    【数据结构】如何应用堆解决海量数据的问题
    软件测试需求分析是什么?为什么需要进行测试需求分析?
    Lyx使用对中文进行编译
    5. 微服务之基于Feign的远程调用
    【数据结构】HashMap 和 HashSet
    怎么压缩成mp4视频?
    小型数据库系统开发作业
    js $prompt密码弹窗(密文输入)+ for循环同步执行(vue elementui)
    JavaScript 通过正则测试页面是否出现连续的重复字符
    彻底讲清电气转换器(I-P电流型、E-P电压型)与电气比例阀的区别
  • 原文地址:https://blog.csdn.net/qq_43562262/article/details/128169565