基本 Form でアイコンを共通化

アプリケーションで複数フォームがある場合、個々のフォームにアイコンを設定するとリソースファイルに重複して登録される。
そこで、アイコンをロードする基本 Form を作って継承させる方法があるが、以下で問題点が指摘されている。
アイコンをベースクラスで設定すると・・・

でもね、FormAやFormBをデザイナで編集すると、そのアイコンが内部に取り込まれちゃうんですよ。
そのたびにIconプロパティにカーソルを合わせてDeleteですよ。

解決方法

Icon プロパティを隠蔽して、デザインモードでは null を返すようにする。*1

// Default Icon Form sample for C#
public class BaseForm : System.Windows.Forms.Form
{
    private bool useDefaultIcon = true;
    private System.Drawing.Icon defaultIcon = null;

    public BaseForm()
    {
        Stream iconStream =
            System.Reflection.Assembly.GetExecutingAssembly()
            .GetManifestResourceStream("Application.ico");
        if (null != iconStream)
        {
            base.Icon = defaultIcon = new Icon(iconStream);
        }
    }

    public new System.Drawing.Icon Icon
    {
        get
        {
            return (DesignMode && useDefaultIcon) ? null : base.Icon;
        }
        set
        {
            useDefaultIcon = (null == value);
            base.Icon = useDefaultIcon ? defaultIcon : value;
        }
    }
}

*1:デザインモードは Component.DesignMode プロパティで判別可能。