假设您有以下课程
public class Message : Control, IDisposable {
internal static class _Text : RichTextBox {
protected override void OnLinkClicked( LinkClickedEventArgs e ) {
System.Diagnostics.Process.Start(e.LinkText);
}
public _Text() {
BorderStyle = System.Windows.Forms.BorderStyle.None;
BackColor = Color.Orange;
ForeColor = Color.White;
ReadOnly = true;
this.Font=new Font( "Segoe UI", 10 );
Text="";
Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
ScrollBars = RichTextBoxScrollBars.None;
}
}
public Message() {
SetStyle( ControlStyles.AllPaintingInWmPaint|ControlStyles.OptimizedDoubleBuffer|ControlStyles.ResizeRedraw|ControlStyles.SupportsTransparentBackColor|ControlStyles.UserPaint, true );
UpdateStyles();
DoubleBuffered = true;
_Text.ContentsResized+=_Text_ContentsResized;
_Text.Location = new Point(15,5);
_Text.Width = Width - 15;
this.Controls.Add( _Text );
_Text.Visible = true;
}
void _Text_ContentsResized( object sender, ContentsResizedEventArgs e ) {
_Text.Height = e.NewRectangle.Height;
base.Height = _Text.Height + 10;
}
}
上述代码中报告的问题(作为示例)如下:
_Text.ContentsResized+=_Text_ContentsResized;
报告
非静态方法需要对象引用
.... (ETC)
this.Controls.Add( _Text );
报告
Message._Text 是一种类型,但被用作变量
并且事件处理程序的内容_Text_ContentsResized
报告了与此处描述的第一个错误相同的错误(如下)
非静态方法需要对象引用
.... (ETC)
保留这背后的概念,我希望内部控件_Text
成为父控件的静态和更自然的元素,Message
但仍然能够访问它的属性和事件。对于属性,我可能会为 get/set 创建一个静态包装器,但是我仍然遇到无法处理来自该对象的任何事件的问题。
所以问题是——如何在不创建对象的后期绑定副本的情况下将事件从静态对象/类提升到非静态调用者(_Text t = new _Text()
)