web-dev-qa-db-ja.com

グローバルスタイル(x:Keyを持たない)をオーバーライドする方法、または代わりに名前付きスタイルをすべてのタイプターゲットコントロールに適用する方法は?

プロジェクト内のすべてのボタンに適用するスタイルを宣言しました。スタイルは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}"/

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

43
Shimmy

これを試して:

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

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

67
Botz3000

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

<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コントロールに適用されます。

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

1
user808128

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

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

0
PortageMonkey