2011-01-30 36 views
7

私は白いテキストの前景色と透明な背景色を持つコントロールを持っています。 後で、このユーザーコントロールは、実際の背景色を持つ別のコントロールに追加されます。XAML:デザインモードでのみ背景色を変更するにはどうすればよいですか?

しかし、これを設計する際に、VS 2010の白い背景に白い背景があるため、私は明らかに何も見ることができません。とにかく、デザインタイムだけのために別の色を定義するには?

if (System.ComponentModel.DesignerProperties.IsInDesignTool) 
{ 
    LayoutRoot.Background = new SolidColorBrush(Colors.Blue); 
} 

をしかし、これは動作しません:

私はこれを試してみました。任意のヒント?

UPDATE:私はこれがあなたたちのためにどのように機能するかを理解しない

。私は、新しいSilverlightの4.0アプリケーションを作成しているとのctorにコード行を挿入しています

public MainPage() 
     { 
      InitializeComponent(); 
      LayoutRoot.Background = new SolidColorBrush(Colors.Blue); 

     } 

<UserControl x:Class="SilverlightApplication3.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 

    <Grid x:Name="LayoutRoot"> 

    </Grid> 
</UserControl> 

私はデザイナーに行くとき、私はまだ青いとしてそれを参照してくださいいけません。私はそこにisInDesignTime Conditionを持っていない。私はここで何が欠けているのですか?

おかげで、 KAVE

あなたは、ユーザーコントロールのコンストラクタ内で次のコードを使用することができます
+0

? –

+0

Andrei、InitializeComponent() – Houman

答えて

3

は一つの方法です:

if (System.ComponentModel.DesignerProperties.IsInDesignTool) 
{ 
    LayoutRoot.Background = new SolidColorBrush(Colors.Yellow); 
} 

あなたがテンプレートコントロールを作成するに切り替える場合は、この例のように、OnApplyTemplateで物事を設定するのを待つ必要があります:

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 
    Border b = this.GetTemplateChild("backBorder") as Border; 
    if (b != null && System.ComponentModel.DesignerProperties.IsInDesignTool) 
    { 
     b.Background = new SolidColorBrush(Colors.Orange); 
    } 
} 

を仮定すると、これはテンプレートです:

<Style TargetType="local:TemplatedControl1"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:TemplatedControl1"> 
       <Border x:Name="backBorder" 
         Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

また、コードlの前後に条件付きコンパイルディレクティブを追加することもできますこれは開発者やデザイナーだけのためであり、実行時には決して必要とされません。

#if DEBUG 
if (System.ComponentModel.DesignerProperties.IsInDesignTool) 
{ 
    LayoutRoot.Background = new SolidColorBrush(Colors.Yellow); 
} 
#endif 

あなたが作成しているUserControlは、設計時に別の *のUserControl /コントロール*内で使用されたときに、この全体の手法のみ動作することに注意してください。したがって、上記のコードをUserControlという名前のUserControlWithDesignModeに配置した場合は、UserControl,UserControlHostというコードを追加して、UserControlWithDesignModeコントロールのインスタンスを含むデザイン時に動作を確認する必要があります。現在編集されているコントロールのコードビハインドは、編集中には実行されません。これは、別のホスト(Silverlightでは、別のホストの場合はUserControlなど)に含まれている場合にのみ実行されます。

+0

お返事ありがとうございます。私のポストでUPDATEを読んでください。多くのご協力ありがとうございます – Houman

+0

私は何が起こっていると考えているのかを説明するためのアップデート(最後の段落)を追加しました。現在編集されているUserControlのコードは、デザイン時には実行されません。コントロールが第2のコントロールに含まれていない場合、コードビハインドでのみ設定すると、 "Blue"の仕事は決して見られません。 – WiredPrairie

0

WPFの場合:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
{ 
    LayoutRoot.Background = new SolidColorBrush(Colors.Blue); 
} 

についてはWPF/シルバー

ここ
+0

はSilverlightと互換性がありますか?申し訳ありませんが私はその銀色を言ったはずでした4.0 – Houman

+1

更新された答えを参照してください。 – ShahidAzim

+0

多くのありがとうございます。しかし、これは実際のユーザーコントロールのデザイナーの視点からはまだ機能しません。しかし、デザイナーモードでこのビューを含む親ビューを開くと、実際の色をオーバーライドする青色が表示されます。なぜ子供のデザインタイムコードはこの影響を受けませんか? – Houman

1

1つのオプションは、UserControlに背景色を設定し、使用する場所をオーバーライドすることです。したがって、UserControlを単独で編集しているときは、背景色を持つことになります。そのUserControlを含むコントロールを編集しているときは、必要に応じて透明な背景で表示されます。

だから、UserControlのXAMLファイルは次のようになります。

<UserControl x:Class="MyUserControl" ... Background="DarkBlue"> 

そして、あなたはそれを使用する他のいくつかの画面で、あなたができる:洗練、単純な

<my:MyUserControl Background="Transparent" ...> 

0

良いスレッドです。特にMVVMを実行しているときに、UserControlsが透明になっていると白く表示されるというのは非常に面倒です。

私はBlendで、デザイナーが実行されているかどうかに基づいて定義された状態でこれを実行できると確信していますが、作業の量を減らすことはできません。それでも

ない誰もが投稿のため、事前にアドバイスのおかげを持っているので、もし、ブレンドを開くことを回避の後ろにコード内のコードを避けるためにどのようにしてください。

私はそれが実行時に目に見えない、ユーザーコントロール内のすべての子コントロールを行いますので、動作しません不透明度

<my:MyUserControl Background="Transparent" ...> 

を使用することをお勧めします。

1つのオプションは、UserControlに背景色を与え、使用する場所をオーバーライドすることです。

UserControlで背景を設定しようとしましたか?なぜ私がそれがうまくいかないのか分かりません。仕事はとても

<UserControl x:Class="..."> 
<StackPanel Background="{StaticResource PhoneChromeBrush}"> 
... 

が、その後伴わないビュー

public View() { 
    InitializeComponent(); 

    var c = Content as Panel; 
    if (c != null) c.Background = new SolidColorBrush(Colors.Transparent); 
} 
1

代替アプローチのコンストラクタに次のコードを置くように、コンテンツの背景を設定することがあるん何

コード:

  1. 「Visual Studio 2012 Color Theme Editor」をインストールしてください: http://visualstudiogallery.msdn.microsoft.com/366ad100-0003-4c9a-81a8-337d4e7ace05
  2. 修正したい1に基づいて新しいカスタムテーマを作成します。
  3. Cider -> ArtboardBackground設定したテーマエディタ
  4. の右上にある検索ボックスに、テーマエディタ
  5. タイプ「アートボード」の左上にある「表示すべての要素」フィルタ]ボタンをクリックします "の色を選択してください。
  6. Yay! :D

注:「Cider -> ArtboardBackground」カラーテーマフィールドがVS2012で発見されたが、私はそれがVS2010

0

に別の技術mentioned in this SO questionを同じ名前を持っているかどうかを確認することはできませんが文書化されていないプロパティを使用することですd:Design­er­Proper­ties.DesignStyle単一コントロールにデザイン時のみのスタイルを適用するのに最適ですが、ResourceDictionaryStyleで動作するようには見えません。に適用されます。適切に型付けされたコントロールまたは要素辞書の範囲にある。

これを解決するには、同じページI provide a simple solutionのデザイナーのみのスタイルをResourceDictionaryに展開します。その回答の要約は次のとおりです。

まず、XAMLディクショナリに目的のスタイルを通常の方法で配置します。設計モードはない場合

<Window.Resources> 
    <Style TargetType="TreeViewItem"> 
     <Setter Property="IsExpanded" Value="True" /> 
    </Style> 
</Window.Resources> 

そして、C#コードでは、Resource­Dict­ionaryからスタイルを削除を検出しました。

protected override void OnInitialized(EventArgs e) 
{ 
    if (DesignerProperties.GetIsInDesignMode(this) == false) 
     Resources.Remove(typeof(TreeViewItem)); 

    base.OnInitialized(e); 
} 

デザインモード:                                                 これはOnInitializedオーバーライドですか   ランタイムモード:あなたは上記のコードを呼ばなかった

design mode     runtime mode

関連する問題