首页 > 其他分享 >聊一下Button事件、命令、行为的触发顺序

聊一下Button事件、命令、行为的触发顺序

时间:2024-03-26 10:55:24浏览次数:29  
标签:触发 MessageBox 顺序 Show Button public 事件 void

1、我们新建一个xaml

<StackPanel Width="200" Margin="20">
    <Button Height="30" Content="按钮" Command="{Binding MsgCommand}" x:Name="btn" Margin="10"/>
</StackPanel>

2、分别在后台写入命令和事件

  public ICommand MsgCommand { get; set; }
 MsgCommand = new DelegateCommand(ExecuteCommand);
    private void ExecuteCommand()
   {
       MessageBox.Show("触发命令");
   }
     btn.Click += Btn_Click;
    private void Btn_Click(object sender, RoutedEventArgs e)
   {
     MessageBox.Show("触发事件");
   }

3、运行,发现事件先触发,
由于事件处理程序是直接附加到按钮的 Click 事件上的,所以在点击按钮时会先触发 Btn_Click 事件处理程序,然后才会执行与按钮 Command 属性相关联的命令 MsgCommand
4、我们接着添加行为

 public class ButtonBehavior:Behavior<FrameworkElement>
 {
     public string SelectItem
     {
         get { return (string)GetValue(SelectItemProperty); }
         set { SetValue(SelectItemProperty, value); }
     }
     public static readonly DependencyProperty SelectItemProperty =
         DependencyProperty.Register("SelectItem", typeof(string), typeof(ButtonBehavior), new PropertyMetadata(null,OnSelectedChanged));

     private static void OnSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
         MessageBox.Show("回调");
     }

     protected override void OnAttached()
     {
         MessageBox.Show("OnAttached");
     }

     protected override void OnChanged()
     {
         MessageBox.Show("OnChanged");
     }

     protected override void OnDetaching()
     {
         MessageBox.Show("OnDetaching");
     }
 }

5、修改前台代码和后台代码

 <StackPanel Width="200" Margin="20">
     <i:Interaction.Behaviors>
         <local:ButtonBehavior SelectItem="{Binding SelectedValue,Mode=TwoWay}"/>
     </i:Interaction.Behaviors>
     <Button Height="30" Content="按钮1" Command="{Binding MsgCommand}" x:Name="btn" Margin="10"/>
 </StackPanel>
  public class MainWindowViewModel : BindableBase
 {
     private string _selectedValue;

     public string SelectedValue
     {
         get { return _selectedValue; }
         set { SetProperty<string>(ref _selectedValue, value); }
     }

     public MainWindowViewModel()
     {
         MsgCommand = new DelegateCommand(ExecuteCommand);
     }

     private void ExecuteCommand()
     {
         SelectedValue = "123";
         MessageBox.Show("触发命令");
     }

     public ICommand MsgCommand { get; set; }
 }

运行后
触发顺序为
1、界面初始化之前,Freezable的Changed事件,2、Behavior的OnAttached事件,
点击按钮后,依次触发,按钮事件、字符串改变,回调,Changed事件,按钮命令,

标签:触发,MessageBox,顺序,Show,Button,public,事件,void
From: https://www.cnblogs.com/guchen33/p/18096099

相关文章

  • springboot项目的目录顺序
    在idea上自动生成的springboot项目中一定要注意文件的上下顺序此时在项目运行时并不会报错但是不会执行utils下的类此时 此时 utils下的类是一个解析类可以解析一份存放在resources下的一份emp.xml文件并把解析后的数据返会给一个集合,因为此时不会执行utils下的类所以......
  • nestJs中 Guards ,Interceptors ,Pipes ,Controller ,Filters的执行顺序
    执行顺序:Guards(守卫):Guards是最先执行的中间件,用于确定是否允许请求继续处理。Guards在请求被路由到控制器之前执行,通常用于身份验证、角色检查或权限验证。如果Guards返回一个布尔值 false 或者抛出一个异常,请求处理流程将终止,不会执行后续的Pipes、Interceptors或控......
  • 排序算法练习——按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺
    按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺序不同的字符串)分组到同一个组中。要按照字符串的异位词分组,可以使用哈希表来将每个字符串排序后作为键,相同键的字符串即为异位词。以下是实现这个算法的Python代码:fromcollectionsimportdefaultdict......
  • JS添加input text、input button
    <body><formid="form1"runat="server"><divid="div1"class="a1"name="aaa"><inputtype="text"class="a3"name="name"value="3"/&g......
  • 2024年3月23日-UE5-触发区域
    新建一个ACTOR叫触发区域  新建立方体,拼成一个类似球门的形状  创建一个点光源,实现子弹打入球门,就触发发光的效果  然后把可视的光默认改为不可见 给球门挂上触发区域 调整覆盖整个球门  给盒体加上触发条件的设置 把光拖出来 然后给子弹打入......
  • 【蓝桥杯嵌入式】四、各种外设驱动(十一)ADC(1):软件触发与中断触发方式
    温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录【蓝桥杯嵌入式】附录目录重点提炼:一、需求分析1、需要的外设资源分析: 2、外设具体分析:比赛时ADC可能需要配置的部分:二、软件配置按照分析配置外设:ADC2_IN15:采用软件触发的方式 ADC1_IN11:采用TIM6触发的方......
  • nginx location匹配规则顺序总结
    Nginx的location匹配顺序是Nginx配置中非常核心且重要的概念,它决定了Nginx如何处理进入服务器的请求。理解location匹配顺序不仅有助于优化Nginx的性能,还能确保网站或应用的正确运行。下面将详细阐述Nginx的location匹配顺序,并通过实例加以说明。Nginxlocation匹配顺序详解精......
  • 【C++ 08】vector 顺序表的常见基本操作
    文章目录前言......
  • C++看程序写结果:类继承与类组合,默认与含参的构造先后顺序 易错
    C++类继承与类组合,默认与含参的构造先后顺序 易错这道题原本是没有那么多输出信息的,是我自己加上了调用什么函数的提示。一开始以为就输出两行,一行是构造父类时A:5,一行是构造子类时x=5,A::x=5。#include"bits/stdc++.h"usingnamespacestd;classA{public:A(){......
  • Vue 的父组件和子组件生命周期钩子函数执行顺序?
    Vue的父组件和子组件生命周期钩子函数执行顺序可以归类为以下4部分:加载渲染过程父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted子组件更新过程父beforeUpdate->子beforeUpdat......