2012-06-20 18 views
0

有沒有人在標準化方面遇到困難,例如更大的應用程序(幾十萬行代碼)的外觀?控件,組件和類型的標準行爲

例如,假設我的應用程序中有很多(數百個)組合框和文本框,我希望它們都具有綠色的前景色和藍色邊框。然後過了一段時間,老闆說:「我想在所有的組合框和文本框中使用粗體文本」。

一種選擇是做手工,但這種方法並不好,因爲: - 這是耗時 - 這是遭受開發商 - 會發生錯誤(在應用程序中的某個地方會有文本框或組合框中將不會有粗體文本)

我在搜索的是一種自動執行(自動應用屬性)或至少自動檢查(以代碼分析工作的方式)的方法。

有人做過類似的事情或在該領域有過期嗎?

+0

WinForms,我收集? – HackedByChinese

+0

一切,其實。 我的例子確實來自WinForms。在WPF中,實現起來更容易一些。 – Zvonko

+0

WebForms,MVC和WPF是一種不同的動物,因爲它們利用樣式表,這意味着除非這些變化對佈局有很大影響(定位,大小等方面的巨大變化),否則這些變化很微不足道。這是WinForms的另一個問題。 – HackedByChinese

回答

1

的WinForms具體建議/答案

這將需要更大的努力來建立,假設是,你必須與成千上萬已經創建某某已經存在的項目......但個人使用的擴展基地對象。

我自己的項目是用winforms編寫的,雖然我們沒有創建自定義控件,但是我們有一個自定義的「UserControl」和一個自定義的「Form」。擴展形式從基本形式繼承所有格式化,結構等等等等。在這種情況下,它的顏色,屬性,突出顯示和其他包含的控件(如表單上默認的「關閉」按鈕)以及自定義事件。

你可以這樣創造的東西:

public class CustomTextBox : TextBox 
{ 
    public override <propertyName> { get; set; } //auto-implemented property   
    ... 
    public CustomTextBox() : base() 
    { 
     propertyName = newDefualtValue; 
     ... 
    } 
} 

它仍然允許這些屬性來手動設置一個實例的基礎上......但現在他們定義一個新的默認值。儘管如此,這可能會對現有項目進行大量編輯。

這可能是最簡單的設置方式,這樣可以更改分佈式但功能相同的大型對象的默認值,而無需單獨編輯它們。您唯一的其他選擇是代碼搜索,搜索和替換操作以及大量測試。

+0

使用自定義控件時,複製/粘貼,搜索/替換錯誤將會發生。沒有辦法解決這個問題。人們很容易出錯,因此有人需要檢查代碼並修復錯誤。這可能需要很長時間。我想找到一個解決方案,這將減輕程序員的負擔。例如,我們已經使用自定義的Form和UserControl基類。我可以擴展它們,通過反射將屬性應用於特定類型/成員。然後,我可以製作StyleCop規則,禁止使用不從子孫繼承的表單和用戶控件。你怎麼看? – Zvonko

+0

聽起來像一個計劃。儘管如此,在添加反射時要小心。它基本上都是基於字符串的,所以當有人發送格式不正確或拼寫的屬性字符串時,您必須添加大量空檢查和/或自定義異常。我喜歡這個風格規則的想法,強迫他們使用自定義類......這樣你以後就不用擔心了。 – Nevyn

0

前一段時間我已經實現,其中我創建的自定義鹼的形式和控制實現的溶液,加入一個屬性並覆蓋在onLoad方法:

public partial class FormBase : Form 
{ 
    public FormBase() 
    { 
     this.InitializeComponent(); 
    } 

    protected ConsistencyManager ConsistencyManager { get; private set; } 

    protected override void OnLoad(System.EventArgs e) 
    { 
     base.OnLoad(e); 

     if (this.ConsistencyManager == null) 
     { 
      this.ConsistencyManager = new ConsistencyManager(this); 
      this.ConsistencyManager.MakeConsistent(); 
     } 
    } 
} 

的ConsistencyManager類查找所有控件,組件也支持在特定控件中搜索自定義子控件。從MakeConsistent方法複製/粘貼代碼:

public void MakeConsistent() 
{ 
    if (this.components == null) 
    { 
     List<IComponent> additionalComponents = new List<IComponent>(); 

     // get all controls, including the current one 
     this.components = 
      this.GetAllControls(this.parentControl) 
      .Concat(GetAllComponents(this.parentControl)) 
      .Concat(new Control[] { this.parentControl }); 

     // now find additional components, which are not present neither in Controls collection nor in components 
     foreach (var component in this.components) 
     { 
      IAdditionalComponentsProvider provider = GetAdditinalComponentsProvider(component.GetType().FullName); 

      if (provider != null) 
      { 
       additionalComponents.AddRange(provider.GetChildComponents(component)); 
      } 
     } 

     if (additionalComponents.Count > 0) 
     { 
      this.components = this.components.Concat(additionalComponents); 
     } 
    } 

    this.MakeConsistent(this.components); 
} 

如果有人想要完整的示例或源代碼請告訴我。

最好的問候, Zvonko

PS:以同樣的方式我也創建了統計上的主線程調用數性能計數器。