套用第三方皮膚庫 (如 SkinSharp、Sunisoft IrisSkin) 後,LinkLabel.BackColor = Color.Transparent 不生效,顯示預設背景色。
皮膚庫透過 Hook 系統繪製訊息 (WM_PAINT/WM_ERASEBKGND) 重繪控制項,**強制覆寫背景繪製邏輯**,忽略 Transparent 設定。LinkLabel 本身不支援真正透明 (需父控制項支援 WS_EX_TRANSPARENT),皮膚庫更破壞原本脆弱的透明機制。
Label lblLink = new Label();
lblLink.Text = "點我前往網站";
lblLink.Font = new Font("微軟正黑體", 9, FontStyle.Underline);
lblLink.ForeColor = Color.Blue;
lblLink.Cursor = Cursors.Hand;
lblLink.BackColor = Color.Transparent; // Label 透明相容性較好
lblLink.Click += (s, e) => Process.Start("https://example.com");
public class TransparentLinkLabel : Control {
public string Url { get; set; }
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
TextRenderer.DrawText(e.Graphics, Text, Font, ClientRectangle, ForeColor,
TextFormatFlags.Left | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis);
// 畫底線
using (Pen p = new Pen(ForeColor)) {
e.Graphics.DrawLine(p, 0, Height - 2, Width, Height - 2);
}
}
protected override void OnClick(EventArgs e) {
base.OnClick(e);
if (!string.IsNullOrEmpty(Url)) Process.Start(Url);
}
}
SkinEngine.SkinControls = false 排除特定控制項。LinkLabel 背景圖片為透明。方案一 (Label 模擬) 開發效率最高、最不易出 Bug、皮膚庫相容性最好。若需複雜互動 (懸停變色、訪問過變色),自訂控制項並處理 MouseEnter/MouseLeave 切換 ForeColor 即可。
避開 LinkLabel 透明度與皮膚庫衝突,改用 Label 或自訂控制項,是最務實的解決之道。