2016-03-21 3 views
1

私は現在XAMLで定義している私のアプリケーション全体でRectanglesのセットを持っています。WPFアプリケーションのすべての四角形の背景を設定するC#

<Rectangle Fill="LightBlue"/> 

現時点では私は多分のでRectangleColourが問題のあまりない変えてきました。

しかし、自分のアプリケーションが成長するにつれて、多くのものがあることは間違いありません。Rectangles色が変わる必要があると判断された場合、スケーラビリティが大きな問題になることがわかります。

RectangleBackgroundを保存する最も効率的な方法は、私のプログラム内のRectanglesをすべて1か所で変更できるようにすることです。

これはまた、TextBoxというスタイルにも拡張されます。アプリ全体でTextBoxごとに1つのカスタムスタイルを設定したい場合は、これにスケーラブルなアプローチは何でしょうか?

+0

あなたは、[スタイルの継承](http://stackoverflow.com/q/11581475/1997232)を使用することができます。 1)そのスタイルのコントロールを別の 'Fill'プロパティで作成する2)それに基づいて新しいスタイルを作成する(そして' Margin 'を設定するなど) ')3)デフォルトのスタイルを変更する(キーなし)。どちらかを変更すると、そのスタイルを使用してコントロールの外観が自動的に変更されます。 – Sinatr

答えて

5

は、スタイルを使用してみてください:

は、すべてのWindowsのすべてのRectanglesに影響を与えるために、あなたのapp.xamlでそれを挿入します。現在Window内だけですべてのRectanglesについては

<Application.Resources> 
    <!-- Use the Color ala "Lorentz Vedeler" to make it reusable --> 
    <SolidColorBrush x:Key="myRectangleBrush" Color="LightBlue" /> 
    <!-- Apply it in Style --> 
    <Style TargetType="Rectangle"> 
     <Setter Property="Fill" Value="{StaticResource myRectangleBrush}" /> 
    </Style> 
</Application.Resources> 

OR

<Window.Resources> 
    <Style TargetType="Rectangle"> 
     <Setter Property="Fill" Value="LightBlue" /> 
    </Style> 
</Window.Resources> 

注:その後、あなたはそれを適用するすべてのRectangleためStyleを設定する必要があるため

x:Keyを指定しないでください。 TargetTypeは、すべてUI-ElementsTypeに適用されます。

<Window.Resources> 
    <Style TargetType="Rectangle" x:Key="RectStyle"> 
     <Setter Property="Fill" Value="LightBlue" /> 
    </Style> 
</Window.Resources> 

<Rectangle Style="{StaticResource RectStyle}" /> 
+1

夜間に私を打ち負かすからDel'd mine。 +1 –

+0

@ChrisW。私は、とにかく代理人の面でもっと困っているようですね:P –

+0

それは担当者のことではなく、人々を援助することだけではありません。 :) –

2

私がapp.xamlファイルでアプリケーションのリソースで色を定義したい:

<Application.Resources> 
    <SolidColorBrush x:Key="myRectangleBrush" Color="#deadb33f" /> 
</Application.Resources> 

その後、あなたはこのようにそれを使用することができます:

<Rectangle Fill="{StaticResource myRectangleBrush}" /> 

利点のこれは、色々なコントロールの色を再利用できるということです。あなたの会社があなたの四角形やいくつかのラインで使用するカラープロファイルを持っている場合、マーケティングはあなたの会社の色を別の色に変更することを決めます。あなたは同時にすべての長方形と線についてそれを変更することができます。

コントロールのデフォルトのスタイルは、ターゲット属性を持つアプリケーションリソースにキー属性を使用しないスタイルを追加することによって行われます。

+1

私は実際にブランディングを伝播しやすくするためにこの答えとFeDeを組み合わせます。その中で私はスタイルテンプレートの中でブラシリソースを使用します。こうすることで、ブラシ名のように何かを変更する必要がある場合は、1つのインスタンスごとに、またテンプレートレベルでのみ行う必要はありません。ちょうど2セント。 –

+0

@ChrisW。それは間違いなく –

+0

に行く方法は今は正しいですか? –

0

WPFウィンドウのテーマを動的に変更するには、いくつかのResourceDictionaryファイルを作成し、次にそのように配置します。フォルダ内Themes

リスト1。ResourceDictionaryファイル(XAML)が

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
... SAMPLE STYLES 
<Style TargetType="Rectangle"> 
    <Setter Property="Fill" Value="Green" /> 
</Style> 
<Style TargetType="TextBox"> 
    <Setter Property="Background" Value="Green"/> 
</Style> 

</ResourceDictionary> 

はその後

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Themes\Blue.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
ウィンドウXAMLで、メインウィンドウのXAML

リスト2.セットのデフォルトのテーマにデフォルトのテーマ(例えばBlue.xaml)を参照してください。

そして、C#コードビハインドモジュールのWindowのControlイベントハンドラ(Button.Clickイベントなど)を使用して、テーマ(「Green.xaml」など)を動的に切り替えます。

リスト3.動的に設定WPFウィンドウのテーマのResourceDictionary

/// <summary> 
/// Dynamically set WPF Window Theme resource dictionary 
/// </summary> 
private void SelectGreenTheme() 
{ 
    // prefix to the relative Uri for Theme resources (xaml file) 
    string _prefix = String.Concat(typeof(App).Namespace, ";component/"); 

    // clear all resource dictionaries in this window 
    // Note: on app level use: Application.Current.Resources.MergedDictionaries.Clear(); 
    this.Resources.MergedDictionaries.Clear(); 

    // add resource theme dictionary to this window 
    // Note: on app level use: Application.Current.Resources.MergedDictionaries.Add 
    this.Resources.MergedDictionaries.Add 
    (
     new ResourceDictionary { Source = new Uri(String.Concat(_prefix + "Themes\Green.xaml, UriKind.Relative) } 
    ); 
} 
関連する問題