zoukankan      html  css  js  c++  java
  • .net 中 C# 简单自定义事件实现

    个人认为事件处理机制是一种很好的机制

    特别是可以方便安全的实现窗口间(子窗口对父窗口,子窗口间等)的消息传递、功能调用

    下面展现的源自以前论坛上看到的一套方法,可能记得不大准确,所以可能不规范,我的理解和注释也很可能有谬误

    但在实际操作中能满足需求也没有发现异常。

    以实现子窗口引起父窗口控件变化为例

    父窗口 XAML段 

     1 <Window x:Class="EventTransBetweenFroms.MainWindow"
     2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4         Title="MainWindow" Height="350" Width="525">
     5     <Grid>
     6         <Label Content="我是主窗口" Height="62" HorizontalAlignment="Left" Margin="151,37,0,0" Name="label1" VerticalAlignment="Top" FontSize="36" Width="201" />
     7         <Label Content="事件已处理" Height="55" HorizontalAlignment="Left" Margin="169,116,0,0" Name="labelMessage" VerticalAlignment="Top" Foreground="Red" FontSize="28" Width="156" Visibility="Hidden" />
     8         <Button Content="子窗口" Height="66" HorizontalAlignment="Left" Margin="213,205,0,0" Name="btnCallChildWnd" VerticalAlignment="Top" Width="70" FontSize="18" Click="btnCallChildWnd_Click" />
     9     </Grid>
    10 </Window>

    子窗口XAML段

    1 <Window x:Class="EventTransBetweenFroms.wndChild"
    2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4         Title="wndChild" Height="300" Width="300">
    5     <Grid>
    6         <Label Content="我是子窗口" FontSize="36" Height="62" HorizontalAlignment="Left" Margin="43,27,0,0" Name="label1" VerticalAlignment="Top" Width="201" />
    7         <Button Content="触发事件" Height="61" HorizontalAlignment="Left" Margin="97,111,0,0" Name="btnTriggerEvent" VerticalAlignment="Top" Width="89" FontSize="20" Click="btnTriggerEvent_Click" />
    8     </Grid>
    9 </Window>

    这一部分没什么特别的

    现希望子窗口中的点击btnTriggerEvent按钮使父窗口中的labelMessage可见

    父窗口代码段

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Windows;
     6 using System.Windows.Controls;
     7 using System.Windows.Data;
     8 using System.Windows.Documents;
     9 using System.Windows.Input;
    10 using System.Windows.Media;
    11 using System.Windows.Media.Imaging;
    12 using System.Windows.Navigation;
    13 using System.Windows.Shapes;
    14 
    15 namespace EventTransBetweenFroms
    16 {
    17     /// <summary>
    18     /// MainWindow.xaml 的交互逻辑
    19     /// </summary>
    20     public partial class MainWindow : Window
    21     {
    22         public MainWindow()
    23         {
    24             InitializeComponent();
    25         }
    26 
    27         private void btnCallChildWnd_Click(object sender, RoutedEventArgs e)
    28         {
    29             wndChild wndchild = new wndChild();
    30             wndchild.MyEvent+=new EventHandler(HandleEvent);               //添加事件托管,可以理解为注册这个事件,之后才能被响应
                                                  //EvntHandler中的参数为响应的函数名
    31 wndchild.Show(); 32 } 33 private void HandleEvent(object sender, EventArgs e) 34 { 35 labelMessage.Visibility = Visibility.Visible;           //响应函数的参数必须为(object sender,EventArgs e)的格式
      36  } 37  } 38 }

    子窗口代码段

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Windows;
     6 using System.Windows.Controls;
     7 using System.Windows.Data;
     8 using System.Windows.Documents;
     9 using System.Windows.Input;
    10 using System.Windows.Media;
    11 using System.Windows.Media.Imaging;
    12 using System.Windows.Shapes;
    13 
    14 namespace EventTransBetweenFroms
    15 {
    16     /// <summary>
    17     /// wndChild.xaml 的交互逻辑
    18     /// </summary>
    19     public partial class wndChild : Window
    20     {
    21         public wndChild()
    22         {
    23             InitializeComponent();
    24         }
    25 
    26         public event EventHandler MyEvent;                    //声明事件
    27         protected virtual void OnMyEvent(object sender, EventArgs e)        //声明触发事件函数,一般以On+事件名为名
    28         {
    29             if (e != null)
    30             {
    31                 MyEvent(sender, e);
    32             }
    33         }
    34 
    35         private void btnTriggerEvent_Click(object sender, RoutedEventArgs e)
    36         {
    37             OnMyEvent(this, new EventArgs());                  //调用触发事件函数,注意指明sender并建立新的EventArgs
    38         }
    39     }
    40 }

    实现。

    小结:本例中自定义事件实现了期望的功能且不破坏窗口的封装,对于一些比较复杂消息传递、功能调用也可以通过继承EventArgs建立自定义事件数据类。

  • 相关阅读:
    Struts2中请求参数的接收方式和ModelDriven机制及其运用
    struts2获得请求参数的方式
    参数(parameter)和属性(Attribute)的区别
    getContextPath、getServletPath、getRequestURI,getRealPath的区别
    struts2的result的type属性
    Struts2的值栈和对象栈
    el表达式跟ognl表达式的区别(转)
    Struts学习之值栈的理解
    创建虚拟机-1
    安装kvm模块配置网络
  • 原文地址:https://www.cnblogs.com/dusmos/p/3201669.html
Copyright © 2011-2022 走看看