2017-07-05 3 views
0

私たちは、スタイルを変更して一貫性を持たせる(スタイル賢明な)いくつかのwinformアプリケーションを用意しています。私たちは、ボタンやツールストリップなどのウィンドウコントロールのいくつかの基本クラスを作成したいと考えています。私の基本クラスは、適用したい特定のスタイリングを指定することを意図しています。これは最初に私のフォームに持っていきますが、後でプロパティを更新したい場合には、すでにそれを取り込んだフォームには適用されません。とにかくこれを動作させるには?ここでは例を挙げて、ツールストリップの基本クラスを作成したいとします。私がしたいのはバックカラーを緑色に設定することです(私は本当にプロパティを追加したいですが、これは私の問題をデモするためです)。そこで、BaseControlsというクラスライブラリを作成し、BaseToolStripというクラスを作成し、コンストラクタでバックカラーを緑に設定します。winformsベースコントロールを作成する

public class BaseToolStrip : ToolStrip 
{ 
    public BaseToolStrip() 
    { 
    BackColor = Color.Green; 
    } 
} 

デモプロジェクトを作成してフォームにBaseToolStripのインスタンスを追加すると、それが機能します。緑色のツールストリップが作成されます。後でBaseToolStripクラスのコンストラクタを更新し、BackColor = Color.Redを設定して、私の解決策を実行すると、色がまだ緑色で、ベースツールストリップに赤の背景色を付けることを決めました。そのコントロールを取り込んだら、backcolor = greenを設定するように見えます。だから私のベースクラスでは、私はbackcolor = redを設定しています。すべてのインスタンスをオーバーライドし、バックカラーをmy BaseToolStripクラスで指定された色に設定する方法はありますか?

+0

基本クラスではないサイドノートは、継承されたクラスなので、 'MyStyledToolStrip'のように優れています。 – TheLethalCoder

+0

これはデザイナーの問題なのでしょうか、それとも実行時にも起こりますか? – TheLethalCoder

+0

実行時にも発生します。 – Nighttrain5150

答えて

2

問題は、WinFormsデザイナーが、そのコントロールを使用するデザイナーのInitializeComponent()に現在の値を保存していることです。
あなたのctorが実行された後で、それがあなたの値を置き換えた後に起こります。

プロパティをオーバーライド/シャドーし、[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]を追加することで、そのようなことを防ぐことができます(&を再オープンしてプロパティを削除するすべてのデザイナーを再度保存する必要があります)。

+0

これは機能します!ありがとう! – Nighttrain5150

+1

これの副作用は、BackColorへの変更が保存されないことです。おそらくそれはあなたにとって望ましいかもしれませんが、もしそれをしたいのであれば、私はセッターを修正してデフォルトから変更しないようにします - とにかくオーバーライドしているからです。 – Blorgbeard

1

プロパティのデフォルト値を設定する(だけでなく、CTORで実際の値に設定)してみてください。私は今テストするVSが利用できていないが、私はそれが原因だろうと思い

[DefaultValue(typeof(Color), "Green")] 
public override Color BackColor { 
    get { return base.BackColor; } 
    set { base.BackColor = value; } 
} 

を現在の値がデフォルトであることに気づく必要があります。そのため、Designer.csに保存する必要はありません。

後で両方の場所で色を変更すると、どこでも更新されるはずです。

もちろん、このコードはの後にフォームにドラッグするコントロールに対してのみ有効です。他のユーザーは既に値が保存されているためです。

関連する問題