2016-02-13 20 views
0

基本上我創造我自己的形式C#「鎖」的Form.BackColor

public class CryForm : System.Windows.Forms.Form 

有幾個原因,其中之一是一個非常特殊的風格。

因此,我希望Form.BackColor屬性被「鎖定」,以黑色,所以它不能從「外部」

CryForm1.BackColor = Color.whatevercolorulike 

應該不可能再改變。

有什麼辦法可以達到這個目的嗎?或者我應該想出一個完全不同的解決方案嗎?

+0

請問爲什麼你不使用WPF? IMO比Winforms更加靈活和動態。使用WPF,您可以通過強制在「窗口」上限制依賴項屬性的值。 – Default

+0

@Default沒有具體原因^^ –

回答

2

如果您的需要是「鎖定」設計時窗體的背景色,可能是最有效和最不容易出錯的解決方案是覆蓋BackColor屬性並用屬性標記,然後從設計器中的窗體繼承。

你可以聲明:

public class FixedBackgroundForm : Form 
{ 
    protected new static readonly Color DefaultBackColor = Color.Black; 

    [Browsable(false), 
     DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public override Color BackColor 
    { 
     get { return base.BackColor; } 
     set { base.BackColor = value; } 
    } 

    public FixedBackgroundForm() 
    { 
     this.BackColor = DefaultBackColor 
    } 
} 

這將同時是自動錶單背景色爲Black防止在設計器中的背景顏色的變化。

當你添加新的形式到您的項目,從FixedBackgroundForm繼承:

public partial class Form1 : FixedBackgroundForm 
{ 
    ... 
} 

如果你需要「修復」,背景色爲黑色不管什麼,只需使用這條線的BackColor二傳手:

set { base.BackColor = DefaultBackColor; } 
0

只需添加

public new Color BackColor 
{ 
    get { return Color.Black; } 
} 

你的代碼!

+0

這不會停止代碼從簡單地做'Control control = cryForm; control.BackColor = Color.Red;'但你可以使用'override'而不是'new'我認爲(並且覆蓋setter)。 –

+0

不行,以前試過,沒有工作。覆蓋也只適用於這樣的方法... –

+1

@SaculRennorb你嘗試用'override'覆蓋setter嗎? 'override'當然適用於虛擬屬性和方法。 –

4

這應該工作,但嘗試設置屬性時不會收到編譯時錯誤。

public override Color BackColor 
{ 
    get { return Color.Black; } 
    set { } 
} 

您可以明確指出,不支持更改BackColor。這將導致運行時異常,如果任何試圖改變它:

public override Color BackColor 
{ 
    get { return Color.Black; } 
    set { throw new NotSupportedException("CryForm doesn't support changing the BackColor"); } 
} 
+0

幾乎它只是缺少顏色的自動'默認',但你是對的 –

1

另一種選擇是把它添加到窗體加載事件:

this.BackColorChanged += (s, e2) => 
{ 
    if (this.BackColor != Color.Black) 
     this.BackColor = Color.Black; 
}; 
+0

這不會工作因爲改變窗體背景顏色的方法可能發生在窗體加載之後。 – Maertin

+0

@Maertin你能解釋一下你的推理嗎?這是一個觸發每次背景顏色變化的事件,特別是在窗體加載後。 – Default

+0

@Default方法可能會工作,但我不認爲form.load事件是放置它的正確位置。必須調用form.load事件才能調用該方法。 – Maertin