.net 中 C# 简单自定义事件实现
个人认为事件处理机制是一种很好的机制
特别是可以方便安全的实现窗口间(子窗口对父窗口,子窗口间等)的消息传递、功能调用
下面展现的源自以前论坛上看到的一套方法,可能记得不大准确,所以可能不规范,我的理解和注释也很可能有谬误
但在实际操作中能满足需求也没有发现异常。
以实现子窗口引起父窗口控件变化为例
父窗口 XAML段
<Window x:Class="EventTransBetweenFroms.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">
<Grid>
<Label Content="我是主窗口" Height="62" HorizontalAlignment="Left" Margin="151,37,0,0" Name="label1" VerticalAlignment="Top" FontSize="36" Width="201" />
<Label Content="事件已处理" Height="55" HorizontalAlignment="Left" Margin="169,116,0,0" Name="labelMessage" VerticalAlignment="Top" Foreground="Red" FontSize="28" Width="156" Visibility="Hidden" />
<Button Content="子窗口" Height="66" HorizontalAlignment="Left" Margin="213,205,0,0" Name="btnCallChildWnd" VerticalAlignment="Top" Width="70" FontSize="18" Click="btnCallChildWnd_Click" />
</Grid>
</Window>
子窗口XAML段
<Window x:Class="EventTransBetweenFroms.wndChild"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="wndChild" Height="" Width="">
<Grid>
<Label Content="我是子窗口" FontSize="" Height="" HorizontalAlignment="Left" Margin="43,27,0,0" Name="label1" VerticalAlignment="Top" Width="" />
<Button Content="触发事件" Height="" HorizontalAlignment="Left" Margin="97,111,0,0" Name="btnTriggerEvent" VerticalAlignment="Top" Width="" FontSize="" Click="btnTriggerEvent_Click" />
</Grid>
</Window>
这一部分没什么特别的
现希望子窗口中的点击btnTriggerEvent按钮使父窗口中的labelMessage可见
父窗口代码段
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 EventTransBetweenFroms
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private void btnCallChildWnd_Click(object sender, RoutedEventArgs e)
{
wndChild wndchild = new wndChild();
wndchild.MyEvent+=new EventHandler(HandleEvent); //添加事件托管,可以理解为注册这个事件,之后才能被响应
//EvntHandler中的参数为响应的函数名
wndchild.Show();
}
private void HandleEvent(object sender, EventArgs e)
{
labelMessage.Visibility = Visibility.Visible; //响应函数的参数必须为(object sender,EventArgs e)的格式
} } }
子窗口代码段
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.Shapes; namespace EventTransBetweenFroms
{
/// <summary>
/// wndChild.xaml 的交互逻辑
/// </summary>
public partial class wndChild : Window
{
public wndChild()
{
InitializeComponent();
} public event EventHandler MyEvent; //声明事件
protected virtual void OnMyEvent(object sender, EventArgs e) //声明触发事件函数,一般以On+事件名为名
{
if (e != null)
{
MyEvent(sender, e);
}
} private void btnTriggerEvent_Click(object sender, RoutedEventArgs e)
{
OnMyEvent(this, new EventArgs()); //调用触发事件函数,注意指明sender并建立新的EventArgs
}
}
}
实现。
小结:本例中自定义事件实现了期望的功能且不破坏窗口的封装,对于一些比较复杂消息传递、功能调用也可以通过继承EventArgs建立自定义事件数据类。
.net 中 C# 简单自定义事件实现的更多相关文章
- vue2.0中v-on绑定自定义事件
vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定. 每个Vue实例都实现了[事件接口],即: 1.使用 $on(eventName) 监听事件 ...
- vue2.0中v-on绑定自定义事件的理解
vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定. 每个Vue实例都实现了[事件接口],即: 1.使用 $on(eventName) 监听事件 ...
- C#超简单自定义事件
我知道你为啥点进来,所以不要犹豫了,立刻马上果断创建控制台项目,直接复制下面精干短小而又强大的代码运行: using System; using System.Collections.Generic; ...
- js简单自定义事件与主动触发事件
var events = { addHandler: function (element, eventType, handler) { if (element.addEventListener) { ...
- javascript高级技巧篇(作用域安全、防篡改、惰性载入、节流、自定义事件,拖放)
安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式字符串.每个类在内部都有一个[[Class]]属性 ...
- Spring 事件(2)- 自定义事件
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- vue第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 )
第八单元(组件通信 子父,父子组件通信 自定义事件 事件修饰符 v-model props验证 ) #课程目标 掌握使用props让父组件给子组件传参(重点) 掌握props属性的使用以及prop验证 ...
- JavaScript使用自定义事件实现简单的模块化开发
WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...
- flex中dispatchEvent的用法(自定义事件) .
Evevt和EventDispatcher类在as3的事件机制中是很重要的角色,dispatchEvent()是EventDispatcher类的一个事件发送方法,它可以发送出Event类或其子类的实 ...
随机推荐
- set_magic_quotes_runtime set_magic_quotes_gpc
set_magic_quotes_runtime(0); 可以修改php.ini中 magic_quotes_runtime boolean的设置 当你的数据中有一些\"'这样的字符要写入到 ...
- hdu 2227
和之前的hdu3030都快一样了 可以参考之前的题解 #include <iostream> #include <cstdio> #include <cstdlib> ...
- codeforces 891 b
B. Gluttony time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- Scala_基本语法
基本语法 声明值和变量 Scala有两种类型的变量: val:是不可变的(变量的引用不可变),在声明时就必须被初始化,而且初始化以后就不能再赋值: var:声明的时候需要进行初始化,初始化以还可以再对 ...
- delphi怎么做桌面滚动文字?
就是在桌面显示从TXT读取出来的字,并限制在1个框内移动(就是从框左边出现往右边移动并从框边消失)我用HDC+textout只是读取字显示到桌面,不知道桌面移动哪位大侠指点下啊,或用其他方法,最好有详 ...
- Android-okhttp下载网络图片并设置壁纸
在AndroidManifest.xml配置网络访问权限: <!-- 访问网络是危险的行为 所以需要权限 --> <uses-permission android:name=&quo ...
- docker - 从安装到部署一个web应用(go、java)
一:安装docker 1.https://docs.docker.com/engine/installation/binaries/ 下载docker最新版二进制tar.gz linux下: wget ...
- 第42件事 移动App设计的11大法则
移动App设计的重要法则指的是我们在设计App需要遵守的一些设计规范和法则,这些法则就好像一些行为规范一样. 1.导航手机客户端上的主导航(一级导航)如图6-22所示. 对图6-22中所示的几个主导航 ...
- 【BZOJ2595】 [Wc2008]游览计划
BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...
- 【BZOJ1053】 反素数ant
BZOJ1053 反素数ant 我们先考虑唯一分解定理求出约数个数: \(x=a_1^{p_1}a_2^{p_2}a_3^{p_3}...a_k^{p_k}\) 然后\(num=\Pi_{i=1}^k ...