0

たとえば、より大きなアプリケーション(数十万行のコード)のルックアンドフィールの標準化に苦労した人はいますか?

たとえば、アプリケーションに多数(数百)のコンボボックスとテキストボックスがあり、それらすべてに緑色の前景色と青色の境界線を設定したいとします。その後、しばらくすると、上司は「すべてのコンボボックスとテキストボックスに太字のテキストが必要です」と言います。

1つのオプションは手動で行うことですが、このアプローチは適切ではありません。-時間がかかる-開発者にとって苦痛である-エラーが発生する(アプリケーションのどこかに太字のテキストがないテキストボックスまたはコンボボックスがある)。

私が探しているのは、その自動(プロパティの自動適用)または少なくとも自動チェック(コード分析が機能するような方法)を行う方法です。

誰かが同じようなことをしたか、その分野で経験がありますか?

4

2 に答える 2

1

Winforms固有の提案/回答

何千ものプロジェクトがすでに作成されていると仮定すると、セットアップにはより大きな労力がかかりますが、個人的に拡張されたベースオブジェクトを使用します。

私自身のプロジェクトはwinformsで記述されており、カスタムコントロールは作成していませんが、カスタムの「UserControl」と拡張するカスタムの「Form」があります。拡張フォームは、基本フォームからすべてのフォーマット、構造などを継承します。この場合、その色、プロパティ、強調表示、およびその他の含まれているコントロール(フォームのデフォルトの「閉じる」ボタンなど)、およびカスタムイベントも同様です。

次のようなものを作成できます。

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

これにより、これらのプロパティをインスタンスベースで手動で設定できます...ただし、新しいデフォルト値が定義されています。ただし、これには既存のプロジェクトの編集に多くの時間がかかる可能性があります。

これはおそらく、分散しているが機能的に同一のLARGEベースのオブジェクトのデフォルト値を個別に編集しなくても変更できるように設定する最も簡単な方法です。他の唯一の実際のオプションは、コード検索、検索と置換の操作、および広範なテストです。

于 2012-06-20T15:28:30.783 に答える
0

少し前に、カスタム ベース フォームとコントロールの実装を作成し、1 つのプロパティを追加して 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);
}

完全なサンプルまたはソースが必要な場合は、お知らせください。

よろしく、 ズヴォンコ

PS: 同様に、メイン スレッドでの呼び出し回数をカウントするパフォーマンス カウンターも作成しました。

于 2012-12-28T08:39:59.690 に答える