使用Resize重繪整個控制元件
阿新 • • 發佈:2022-04-04
當自定義控制元件或windows fomrs 製件,如Panel,被重置,只有這些控制元件最新暴露的部分才會被重新繪製。然而,有時這些行為不會提供想要的結構(可見下面的圖片1).
這個示例通過設定控制元件的ResizeRedraw屬性,來演示如何確保重置後對整個控制元件進行重繪。
ResizeRedraw:定義在Control類中的受保護屬性,該屬性指示控制元件在調整大小時是否重繪自己。為了確保使用resize對整個控制元件進行重繪,設定resize屬性為true。這個工作通常在繼承類的建構函式中進行。
[C#] public MyControl() { InitializeComponent(); ResizeRedraw= true; }
或者,如果你不想要或不能建立一個繼承類,可以用反射設定屬性或簡單地使用控制元件的resize事件呼叫Invalidate或Refresh函式:
[C#] using System.Reflection; public static void SetResizeRedraw(Control control) { typeof(Control).InvokeMember("ResizeRedraw", BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic,null, control, new object[] { true }); } [C#] myControl.Resize += new EventHandler(myControl_Resize); private void myControl_Resize(object sender, EventArgs e) { ((Control)sender).Invalidate(); }
示例控制元件
下面是使用者控制元件的程式碼,當控制元件的尺寸變化時,用於顯示橢圓形的擴大與縮小。
[C#] public partial class MyControl : UserControl {public MyControl() { InitializeComponent(); ResizeRedraw = true; } protected override void OnPaintBackground(PaintEventArgs e) { base.OnPaintBackground(e); // draw a blue ellipse into the control area e.Graphics.FillEllipse(new SolidBrush(Color.Blue), 2, 2, ClientRectangle.Width - 4, ClientRectangle.Height - 4); } }
沒有ResizeRedraw引數,控制元件僅部分進行重繪,結果就是像圖片1;當ResizeRedraw = true
,控制元件就如下面圖片所示可以正確重繪。