2012-01-30 21 views
3

コンパクトフレームワーク(3.5)コントロールがあり、デフォルトの色はSystemColors.Windowで、編集コントロールと似ています。私が抱えている問題は、Visual Studio(2008)は常に、デフォルトのBackColorControl)のデザインサーフェス上のコントロールをレンダリングすることです。私はそれがベースControlのデフォルトのバックカラー、親から、またはSiteからそれを引っ張っていると仮定します。カスタムCFコントロールのアンビエントBackColorをオーバーライドする方法

Visual StudioにどのようにデフォルトのBackColorを指定するかを誰かが知っていますか?

public class MoneyInput : Control 
{ 

    public MoneyInput() 
    {    
     base.BackColor = SystemColors.Window; 
     base.ForeColor = SystemColors.WindowText; 
    } 

    public override Color BackColor 
    { 
     get 
     { 
      return base.BackColor; 
     } 
     set 
     { 
      base.BackColor = value; 
      Repaint();     
     } 
    } 

} 

ここに、私のDesignTimeAttributes.xmtaファイルの適切なセクションがあります。あなたは以下を参照してくださいと私は本当に私はちょうど仕事にを取得しようとしていた、ホワイトのデフォルトの色を望んでいないことに注意してください:

<DesktopCompatible>true</DesktopCompatible> 

<Property Name="BackColor"> 

    <Browsable>true</Browsable> 

    <DesignerSerializationVisibility> 
    DesignerSerializationVisibility.Visible 
    </DesignerSerializationVisibility> 

    <DefaultValue> 
    <Type>System.Drawing.Color</Type> 
    <Value>System.Drawing.Color.White</Value> 
    </DefaultValue> 

    <Category>Appearance</Category> 

    <Description>The background color of the control</Description> 

</Property> 

ただ、いくつかのより多くを追加します進捗状況(またはその欠如)、コントロールにログを追加して、コントロールをデザイン面にドロップしたときに何が起きているかを確認できるようにしました。コンストラクタ内のBackColorへの書き込みは有効になり、コントロールからウィンドウに色が変更されます。しかし、デザイナーのインフラストラクチャでは、(プロパティを介して)コントロールに色を戻します。これはctorの後で、OnResizeとOnHandleCreatedの前に発生します。コントロールが正しい値でデザイナにBackColorプロパティをシリアル化した場合、それは安全に設定されますが、デザイナには既定値が含まれません。

最後に編集したのは、(ベースタイプではなく)列挙型を指定するためのデフォルト値構文が正しくないと思います。私は以下に投稿したソリューションを使用していますが、それはハックであり、うまくいけば次の人が実際にそれを解決することができます。

+0

あなたは 'OnShow'イベントを作成し、そこにあなたのコントロールを色付けすることはできますか? – jp2code

+0

@ jp2codeオーバーライドするOnShowメソッドはありません。 – tcarvin

答えて

0

私はまだ本当の答えを得ることを望んだが、私はここに私の回避策ソリューション鎮圧ます:

public class MoneyInput : Control 
{ 

    // workaround for colors 
    private bool _constructed = false; 
    private int _handlesCreated; 


    public MoneyInput() 
    { 
     this.BackColor = SystemColors.Window; 
     this.ForeColor = SystemColors.WindowText; 
     _constructed = true; 
    } 

    public override Color BackColor 
    { 
     get 
     { 
      return base.BackColor; 
     } 
     set 
     { 
      // The logic below is based on: 
      // 
      // 1. If not _constructed then we are getting called 
      //  from our ctor and we want the set to happen. 
      // 2. If we do not have a Handle yet then we are 
      //  getting called by the infrastructure that 
      //  creates a control. 
      // 3. At design-time, the VS designer applies the 
      //  Ambient color even if we explicitly set 
      //  our own color. It is supposed to only apply 
      //  the Ambient if we have not explictly set 
      //  a color. 
      // 4. At runtime we must accept any color changes 
      //  that are passed to us. 


      // see if VS designer is screwing with us 
      bool ignoreColorSet = 
       _constructed 
       && _handlesCreated == 0 
       && RunningInDesigner; 


      if (!ignoreColorSet) 
      { 
       base.BackColor = value; 
       Repaint(); 
      } 


     } 
    } 


    protected override void OnHandleCreated(EventArgs e) 
    { 
     _handlesCreated++; 
     base.OnHandleCreated(e);   
    } 

    private bool RunningInDesigner 
    { 
     get 
     { 
      // this control is mobile-only so if we are running on full 
      // windows we must be in design mode. Note that this works 
      // even if we are not Sited yet, where as checking the 
      // DesignMode property can't be done untl the control has 
      // a Site. 
      return (System.Environment.OSVersion.Platform == PlatformID.Win32NT 
       || System.Environment.OSVersion.Platform == PlatformID.Win32Windows); 
     } 
    } 

}  
+0

これは1ヶ月ですが、これは利用可能な回答と同じくらい良いと思います... – tcarvin

関連する問題