zoukankan      html  css  js  c++  java
  • 编码模式(一) 控件之间的消息传递

    假设我们有两个Control,需要进行消息传递(双向的),假设这两个Control叫做A和B。A界面上的修改(比如,Name被修改了),需要反应到控件B上,同时进行刷新。
    那么,下面一种模式可以供您参考。
    首先看我定义的一个EventArgs和Handler的代码:
    using System;

    namespace Genersoft.Platform.Designer
    {
        
    /// <summary>
        
    /// Process的各种属性定义与Explorer的交互
        
    /// </summary>

        public class ProcessPropertyEventArgs : EventArgs
        
    {
            
    private string name;
            
    private bool canChanged;
            
    /// <summary>
            
    /// 传递参数
            
    /// </summary>
            
    /// <param name="name">Process的名字</param>
            /// <param name="canChanged">是否可以改变该名称</param>
            public ProcessPropertyEventArgs(string name, bool canChanged)
            
    {
                
    this.name = name;
                
    this.canChanged = canChanged;
            }


            
    /// <summary>
            
    /// Process的名字
            
    /// </summary>

            public string Name
            
    {
                
    get
                
    {
                    
    return name;
                }

            }


            
    /// <summary>
            
    /// 指定名称是否可以被更改
            
    /// </summary>

            public bool CanChanged
            
    {
                
    get
                
    {
                    
    return canChanged;
                }

                
    set
                
    {
                    canChanged 
    = value;
                }

            }

        }


        
    public delegate void ProcessPropertyHandler(object sender, ProcessPropertyEventArgs e);
    }


    然后下面是A中的代码:
    public event ProcessPropertyHandler ProcessPropertyChanged;

    下面是属性定义:
    private string name;
    public string Name{
        get{
            return name;
        }
        set{
            // 保存原来的值
            string originalName = this.name;
            name = value;
            // 通知外部,名称已经被修改
            ProcessPropertyEventArgs ppea = new ProcessPropertyEventArgs(this.name,false)
            if(null != ProcessPropertyChanged)ProcessPropertyChanged(this,ppea);       
            // 如果不允许被修改,那么设置回来
            if(false == ppea.CanChanged )this.name = originalName;
        }
    }

    然后看class B的代码:
    private void SomeFunc(){
        ClassA ca = new ClassA();
        // Handle住控件A名称改变的事件
        ca.ProcessPropertyChanged += new ProcessPropertyHandler(OnProcessNameChanged);
    }

    private void OnProcessNameChanged(object sender, ProcessPropertyEventArgs e){
        // 作重复性检查
        bool canChanged = RepeatedlyCheck(e.Name);
        if(false == canChanged){
            // 通知控件A,名称不允许修改
            e.CanChanged = false;
            MessageBox.Show(LanguageManager.Instance.TranslateMessage(“RepeatedlyMessage“));
            return;
        }
        else{
            myName = e.Name;
        }
    }
    通过这种方式,我们就实现了control之间的交互。当然,这种方式是按照.net中delegate的含义来做的。而如果想把所有事件的handler都放在一起,那么可以采用观察者模式。不过,我们的代码中,目前没有这么做。

    这是方式之一,希望不会误导初学者。也希望大家指正。
  • 相关阅读:
    NaN数值类型
    模板字符串
    一文带你速懂虚拟化KVM和XEN
    CentOS 8配置本地yum源及DNF简介
    fxksmdb.exe 是什么进程?
    入行IT,一定要会Linux吗?
    干货|Linux平台搭建网关服务器
    忘带U盘了??别急!一行python代码即可搞定文件传输
    手把手教你如何搭建一个私有云盘
    误删重要文件怎么办?学会Linux 救援模式再也不担心
  • 原文地址:https://www.cnblogs.com/juqiang/p/52611.html
Copyright © 2011-2022 走看看