图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享如何在组件(component中)模拟用户控件(UserControl)中FindForm()的教程,热爱PS的朋友们快点看过来吧!
【 tulaoshi.com - 编程语言 】
使用Component编程是一项值得推崇的技术,它既具有可视化的界面编程模式,又不向UserControl那样体积庞大。但是,熟悉UserControl的朋友们都知道,在UserControl类中有一个FindForm()函数,返回UserControl所在的窗体的引用,这将大大方便我们对窗体的控制----尽管这可能有些越俎代庖的味道,但有时我们就需要这种控制能力。
但是,在Component并没有提供这样的函数,你可以使用其它的一些技巧来取得Component所在的窗体的引用,比如在Component的构造函数中使用Application.AddMessageFilter(this),然后取出由窗体发来的消息的句柄,就可以得到窗体的引用,缺点是不能设计时刻就获得窗体引用;比如可以给Component加一个StyleForm的属性,然后你就可以在设计器中用鼠标选择一个,缺点是你必须手动来选择。
今天,花了半天的时间,终于设计出了克服了以上两个缺点的方案,代码如下:
using System; using System.ComponentModel; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.ComponentModel.Design; using System.Windows.Forms; namespace FindFormSimulation { public partial class BaseStyle : Component { public BaseStyle() { InitializeComponent(); } public BaseStyle(IContainer container) { container.Add(this); InitializeComponent(); } /**//// summary /// 关键在这里,对基类的Site重载。 /// /summary public override ISite Site { get { return base.Site; } set { if (base.Site != value) { base.Site = value; //使用反射机制,在设计时刻取得你要控制的窗体。 IReferenceService referenceService = (IReferenceService)this.GetService(typeof(IReferenceService)); if (referenceService != null) { /**////下面这句用于取得本组件所在的窗体对象。 object[] parent = referenceService.GetReferences(typeof(Form)); Form container = parent[0] as Form; StyleForm = container; /**////如下方法测试,可以知道parent.Length总是为1的。 //StyleForm.Text = parent.Length.ToString(); } } } } private Form styleForm = null; [Description("本组件所要控制的窗体"), DefaultValue(null)] public Form StyleForm { get { return styleForm; } set { if (styleForm != value) { styleForm = value; } } } } }
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
来源:http://www.tulaoshi.com/n/20160219/1603061.html
看过《如何在组件(component中)模拟用户控件(UserControl)中FindForm()》的人还看了以下文章 更多>>