2012-03-22 4 views
0

私は警察の車に搭載されたラップトップコンピュータで実行されるWPFアプリケーションを構築しています。アプリは夜間の目に負担を軽減するために、より暗い色を使用する「ナイトモード」を持たなければなりません。色を変更する方法のアドバイスが必要

役員が運転している間にアプリケーションが使用されるため、すべてのコントロールのサイズを増やしました。コンボボックスのような新しいデフォルトテンプレートを定義しました。これは、画面を一目でわかりやすくし、ソーセージの指を持っているときにタッチスクリーン上のコントロールを簡単に叩くようにするためです。

TimesOfDayという列挙を作成しました。列挙には、DayTimeNightTimeの2つの値があります。各コントロールにはTimesOfDay列挙型のTimeOfDayというDepenencyPropertyがあります。メイン画面にはTimeOfDayプロパティの値を変更するためのボタンがあります。ボタンをクリックすると、TimeOfDayプロパティの値が2つの値の間で循環します。

私はまだWPFの新機能ですから、Xaml側でこれについてどうやって行くのかは分かりません。私がする必要があるのは、たとえばDayStyleという名前のスタイルとNightStyleという名前の2つのスタイルを作成することだと思います。次に、TimeOfDayプロパティが変更されたときに、コントロールに適用されるスタイルを変更するためにトリガーを追加する必要があります。そうですか?

コントロールの背景色と前景色を種類ごとに変更するだけですか?要素名でもできますか?

私はこのすべてを非常にあいまいにしています。どんな助けもありがとう。

トニー

答えて

1

各コントロールはDepenencyPropertyがTimesDay列挙型のTIMEOFDAYと呼ばれています。

だけApplication.ResourcesMergedDictionariesを経由してあなたがしてswitchできる別のResourceDictionariesに2つの完全なテーマを作成する、ことをしないでください。昼間の情報をコントロールに入れる必要はありません。

+0

これは面白そうだし、やりやすいはずです。私は現在、色を設定しています(この例では、 'DynamicResource'節を使って参照しているapp.xamlファイルにいくつかの' Brushes'を定義しています)。私の問題は、 'ResourceDictionaries'がディスク上のファイルに存在しないようにすることです。実行可能ファイルにリソースとして埋め込み、そこから取得することはできますか? –

+0

@ TonyVitabile:恐らくまだ自分自身で試したことはありませんが、[この質問](http://stackoverflow.com/questions/709087/load-a-resourceced-from-an-assembly)参考になるかもしれません。他の人も同様です。 –

+0

私はいくつかの色を変更しましたが、私はメカニズムを働かせています。また、ResourceDictionariesはリソースとして実行可能ファイルに埋め込まれています。今では、夜間にすべての色を設定し、ブラシリソースを使用するのを忘れたプロパティを調整する必要があります。ありがとう! –

0

このガイドに従ってください:http://weblogs.asp.net/psheriff/archive/2009/12/01/load-resource-dictionaries-at-runtime-in-wpf.aspx

  1. は、様々なXAMLリソースファイルを作成しますが、ファイルではなく、binディレクトリにコンパイルして、コピーしないことを確認してください。
  2. DynamicResourceでxamlコントロールを装飾します。
  3. リソースをコードでロードします。

基本的には、アプリケーションを「スキン(skin)」しようとしています。リソースファイルに読み込まれるコードは、TimeOfDay列挙型を利用できます。

自動化したい場合は、自動的にリソースの変更を試み、アプリケーションの起動時にタイマーを設定するタイマーを持つ静的クラスを持つこともできます。 :)

0

私は重複したコードが嫌いなので、私はスタイルを複製しません...あなたは簡単にControlTemplateでトリガとそれを達成できます。

<Trigger Property="TimeOfDay" Value="NightTime"> 
    <Setter TargetName="someControl" Property="Background" Value="Black" /> 
    <Setter TargetName="someOtherControl" Property="ForeGround" Value="Yellow" /> 
    ... 
</Trigger> 

別のオプションは、私がhereを記載された技術を使用することです。この方法では、コントロール自体の情報をTimeOfDayにする必要はなく、アンビエントプロパティーにすることもできます。

+0

あなたのブログ記事の添付プロパティのアプローチが面白く見えます。私はそのショットを与えるかもしれない。 –

+0

ここでは、私は重複したコードが嫌いなので、2つのスタイルを維持し、それぞれのコントロールでトリガーを持つよりもアプリケーションのレベルでトリガーする方がはるかに簡単です...彼はおそらく多くはありませんとにかく彼のアプリの色は、あなたがしていることは、実際にはアプリのレベルでいくつかの色をトリガーするより重複したコードを意味するだろう – David

+0

私はコントロールテンプレートにトリガーを適用するトーマスの提案を使用しようとし始めました。しかし、私が明確にしていないのはどこに置くのか?私のコントロールのほとんどはカスタムコントロールではなく、UserControlsです。私はそれらのいくつかを持っている、と私はすべてを変換することができると思うが、私はする必要がありますか? –

関連する問題