37

アプリケーションでカスタム テーマを使用したいのですが、私が知る限り、リソース ディクショナリを使用して App.xaml で参照することで実現できます。スタイルは、次のようにデフォルトをオーバーライドします。

<Style TargetType="{x:Type Label">
    <Setter Property="Foreground" Value="Green" />
</Style>

デフォルトのラベルスタイルは同じ値で上書きされていると思いますが、ラベルのフォントはすべて緑色です。問題は、あるラベルのスタイルをどこかで再度設定したいときに始まります。このようにグリッド内の他のプロパティを変更したい場合

<Grid.Resources>
    <Style TargetType="{x:Type Label">
        <Setter Property="FontSize" Value="28" />
    </Style>
</Grid.Resources>

グリッド内のすべてのラベルの前景色が失われ、再びデフォルトの色になります (前のステップでデフォルトをオーバーライドしませんでしたか?)。Styleいくつかの試行の後、これを適切に行うには、宣言に別のプロパティを追加する必要がBasedOn={StaticResource {x:Type Label}}"あり、それが機能することがわかりました。アプリ全体で同じ BasedOn コードを繰り返さなければならないので、これはちょっと奇妙です。たとえば、HTML + CSS スタイルは継承およびマージされ、WPF では置き換えられます...

スタイル コントロールを使用しない場合でも、何らかの方法で外観を取得していることに注意してください (システム テーマ?)。スタイルに追加のコードがなくても、デフォルトで緑色であるべきだと彼らが考えるように、どこか別の場所でデフォルトを探すように指示するにはどうすればよいですか?

BasedOn プロパティの設定を自動化する方法はありますか? それとも、これを全体的に行う方が良いでしょうか?

4

2 に答える 2

38

私も同じ問題を抱えていました。私はザックの答えを使用し、次のように改善したので、スタイルを指定しない場合でも、オーバーライドされたデフォルトが考慮されます。これは基本的に実行したことですが、ResourceDictionary で 1 回だけです。

<Window x:Class="TestWpf.RandomStuffWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Random Stuff Window">
  <Window.Resources>
    <ResourceDictionary>
      <!-- Default Label style definition -->
      <Style TargetType="{x:Type Label}">
        <Setter Property="Foreground" Value="Green" />
      </Style>
      <!-- Extending default style -->
      <Style TargetType="{x:Type Label}" 
             x:Key="LargeGreenForegroundLabel" 
             BasedOn="{StaticResource {x:Type Label}}">
        <Setter Property="FontSize" Value="28" />
      </Style>
    </ResourceDictionary>
  </Window.Resources>
  <StackPanel>
    <Button Click="Button_Click">Click</Button>
    <Label Content="GreenForegroundLabel" /> <!-- Uses default style -->
    <Label Style="{StaticResource LargeGreenForegroundLabel}" 
           Content="LargeGreenForegroundLabel" />
  </StackPanel>
</Window>
于 2016-01-05T11:14:07.753 に答える
14

Wpf にはさまざまなレベルのスタイルがあり、グローバル > ローカルの順に適用されます。コントロールに直接設定されたスタイルは、例のようにグローバルに設定されたスタイルをオーバーライドします。コントロールがスタイルを検索するさまざまな場所のリストを見つけようとしていましたが、現時点では見つかりません。私の知る限り、BasedOn プロパティを使用してスタイルを継承し、そのスタイルのプロパティをローカルに設定したスタイルで完全にオーバーライドする必要はありません。

別のスタイルに基づいたスタイルを持つリソース ディクショナリの例を次に示します。そのため、BasedOnバインディングを何度も繰り返す必要はありません。そのスタイルにしたい特定の要素にスタイルを設定するだけで済みます。

<Window x:Class="TestWpf.RandomStuffWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Random Stuff Window">
  <Window.Resources>
    <ResourceDictionary>
      <Style TargetType="{x:Type Label}" 
             x:Key="GreenForegroundLabel">
        <Setter Property="Foreground" Value="Green" />
      </Style>
      <Style TargetType="{x:Type Label}" 
             x:Key="LargeGreenForegroundLabel" 
             BasedOn="{StaticResource GreenForegroundLabel}">
        <Setter Property="FontSize" Value="28" />
      </Style>
    </ResourceDictionary>
  </Window.Resources>
  <StackPanel>
    <Button Click="Button_Click">Click</Button>
    <Label Style="{StaticResource GreenForegroundLabel}" 
           Content="GreenForegroundLabel" />
    <Label Style="{StaticResource LargeGreenForegroundLabel}" 
           Content="LargeGreenForegroundLabel" />
  </StackPanel>
</Window>
于 2013-03-22T17:48:26.597 に答える