5

次の状況があります(簡略化):

ResourceDictionary で、Label の名前付きスタイルをいくつか定義しました。

<Style
    x:Key="sNormalLabel"
    TargetType="Label" >
    <Setter Property="FontFamily" Value="Verdana" />
    <Setter Property="FontSize" Value="12" />
    <!-- ... -->
</Style>
<Style
    x:Key="sHeaderLabel"
    TargetType="Label"
    BasedOn="{StaticResource sNormalLabel}" >
    <Setter Property="FontSize" Value="16" />
</Style>

次に、キーを持たないスタイルで、BasedOn で参照することにより、そのうちの 1 つをデフォルトにします。

<!-- Apply Normal label automatically -->
<Style 
    TargetType="Label"
    BasedOn="{StaticResource sNormalLabel}" />

通常のスタイルのラベルを自動的に適用することは非常に便利だと思いました。そうすれば、将来、デザイン チームが Wingdings などを使用することを決定した場合、アプリケーション全体 (実際にはすべてのアプリケーション同じ ResourceDictionary を共有します)。

UserControl の作成 sHeaderLabel スタイルで上部にラベルを追加したいので、適用します。

Style={StaticResource sHeaderLabel}

USerControl XAML で、すべてデザイナーで問題なく表示されます。

ただし、UserControl を MainWindow に追加すると、ヘッダー ラベルは sNormalLabel スタイル (自動的に適用されるスタイル) に戻ります。

スタイルが適用される順序に関係していると思います。UserControl は作成後に MainWindow によってスタイル設定され、sHeaderLabel スタイルは自動スタイルによって上書きされます。

これにより、いくつかの未回答の質問が残ります。

  1. 私が行ったように自動的に適用されたスタイルを使用することは珍しく、ベストプラクティスに反していますか? とても実用的だと思いましたが、これは間違った方法かもしれません。
  2. これらの自動スタイルが適用されないように、特定のコントロールを明示的に除外する方法はありますか? 考えられる唯一の方法は、Label を HeaderLabel で拡張し、別のリソース キーを適用して、HeaderLabel に sHeaderLabel スタイルが自動的に適用されるようにすることです。他に方法はありますか?

誰かが同様のことで実際の経験を持っている場合は、いくつかの指針をいただければ幸いです。

編集: 興味深いことに、これらの問題は Font* プロパティでしか見られないことに気付きました。前景/背景ブラシを通常/ヘッダー スタイルで異なる設定にすると、(sHeaderLabel にスタイル設定された) UserControl のラベルが正しい色のままになります。ただし、sHeaderLabel で FontWeight を太字に設定しても効果はありません。

また、HeaderTExtBox スタイルを使用して、同じ方法で TextBox スタイルを設定しましたが、ラベルのみで問題は発生しません。

乾杯!

./フレドリック

4

2 に答える 2

2

結果が予測不能になる可能性があるため、ベースの自動スタイルを標準タイプに適用することは避けることをお勧めします。

最終的にあなたの問題になったものに対応して、良い例は にスタイルを適用することTextBlockです。このスタイルは、 、 、および設定しているスタイルを上書きしない を含むフレームワーク内の他のコントロールに適用さLabelれますButtonTextBlock

スタイルをタイプのすべてのインスタンスに適用する場合、スタイルを「適用解除」することはできません。スタイルを新しいスタイルでオーバーライドすることしかできません。これが影響するアプリケーション内のすべて (作成したコントロールのスタイルなど) を正確に予測できない場合は、自動スタイルを使用してx:Key.

于 2013-07-30T16:51:58.017 に答える