49

プロジェクト内のすべてのボタンに適用するスタイルを宣言しました。スタイルは ResourceDictionary にあります。

<Style TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>

今、いくつかのウィンドウで、このスタイルから継承したいが、値を追加したい:

<Style TargetType="StackPanel"> 
    <Setter Property="Margin" Value="5"/>
</Style>

問題は、グローバル スタイルから継承されないことです。継承するには、グローバル スタイルにキーを割り当てる必要があります。

<Style TargetType="StackPanel" x:Key="StackPanelStyle" />

そして、ウィンドウの XAML 継承 (またはオーバーライド - オプション) で、次のようにします。

<Style TargetType="StackPanel" BasedOn="StackPanelStyle" />

問題は、キーを割り当てた場合、それはグローバルではなく、各ウィンドウ/スコープで呼び出す必要があることです。

私の質問に対する解決策は、2 つのうちの 1 つである必要があります (他に見逃しているものはありますか?)。

  1. アプリケーション全体で対象となるすべてのコントロールに自動的に適用される、キーを持つグローバル スタイルを用意します。
  2. ResourceDictionary レベルの名前のないスタイルを参照せずにオーバーライドする方法。

実際に機能する名前付きスタイル (ResourceDictionary 内) の近くでスタイルを再宣言することを考えました。

<!--In the ResourceDictionary-->
<Style x:Key="StackPanelStyle" TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
<!--In the app.xaml-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/>
<!--In the window/page scope-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/

しかし、愚かにもすべてのスタイルを再宣言するよりも優れたものを探しています。

4

3 に答える 3

79

これを試して:

<Style TargetType="{x:Type StackPanel}" BasedOn="{StaticResource {x:Type StackPanel}}">
  <!-- ... -->
</Style>

App.xamlのResourceDictionaryで基本スタイルを宣言しました。このような特定のウィンドウでそれらをオーバーライドすると、通常は機能します。

于 2009-08-20T07:33:00.423 に答える
1

グローバル リソース ディクショナリのどこかに、キーを使用して基本スタイルを定義します。この基本スタイルは、そのスタイルを適用するすべての型の基本となる型を対象としています。次に、必要なタイプを対象とし、上記の基本スタイルに基づくスタイルを定義します。

<Style
    x:Key="upDownBaseStyle"
    TargetType="{x:Type Control}">
    <Setter
      Property="Margin"
      Value="2" />
    <Setter
      Property="HorizontalAlignment"
      Value="Stretch" />
    <Setter
      Property="VerticalAlignment"
      Value="Center" />
  </Style>

  <Style
    TargetType="{x:Type xceed:IntegerUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

  <Style
    TargetType="{x:Type xceed:DoubleUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

これで、最後の 2 つのスタイルが、アプリケーション内のすべての IntegerUpDown コントロールと DoubleUpDown コントロールに適用され、キーについて言及することはありません。

したがって、基本ルール: 基本スタイルにはそれを参照するためのキーが必要であり、派生スタイルはそうでない可能性があるため、キーなしで適用できます (ターゲット タイプによってのみ)。

于 2015-05-13T06:12:09.930 に答える
0

ここで探しているのは、一般にユーザー コントロールを作成することによって達成されるマスター スタイルまたは動作シナリオであることをお勧めします。「グローバル」スタイルが適用された新しいボタン コントロールを作成する場合、そのコントロールを使用する場所ならどこでも、必要に応じて新しいスタイルを追加したり、スタイルをオーバーライドしたりできます。

ユーザー コントロールを作成していない場合は、簡単に実装できます。

于 2009-08-20T04:01:29.277 に答える