グローバル スタイル (x:Key を持たない) をオーバーライドする方法、または代わりに名前付きスタイルをすべてのタイプ ターゲット コントロールに適用する方法は?
-
19-09-2019 - |
質問
プロジェクト内のすべてのボタンに適用するスタイルを宣言しました。そのスタイルは 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 つである必要があります。 (他に何か見逃しているものはありますか?):
- キーを含むグローバル スタイルを持ち、アプリケーション全体の対象となるすべてのコントロールに自動的に適用されます。
- 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}"/
しかし、私は愚かにすべてのスタイルを再宣言するよりも良いものを探しています。
解決
これを試してください:
<Style TargetType="{x:Type StackPanel}" BasedOn="{StaticResource {x:Type StackPanel}}">
<!-- ... -->
</Style>
私は、私はこのような特定のウィンドウでそれらをオーバーライドする場合、それは通常動作しますが、App.xaml内のResourceDictionaryで私の基本スタイルを宣言しています。
他のヒント
どこかのグローバルリソースディクショナリにあなたはキーで基本スタイルを定義します。この基本スタイルは、あなたがそのスタイルを適用する予定のため、すべてのタイプのベースであるタイプを対象としています。そして、あなたが望むタイプをターゲットとし、上記の基本スタイルに基づいているスタイルを定義します。
<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>
これで最後の二つのスタイルは、キーの一切の言及せずに、アプリケーション内のすべてのIntegerUpDownとDoubleUpDownコントロールに適用されます。
だから、基本ルール:基本スタイルは、それを参照するためのキーを持っている必要があり、そして派生スタイルはないので、彼らは任意のキーをせずに適用することができること - 唯一のターゲット・タイプによって、
。私はあなたがここを探している可能性があり、一般的には、ユーザーコントロールを作成することによって達成されたマスター・スタイルや行動シナリオであることを示唆しています。あなたはそれに適用されるあなたの「グローバル」なスタイルを持つ新しいボタンコントロールを作成した場合、その後、どこでもあなたは彼らが必要とされたとき/場合は、単にスタイルを任意の「の新しいのスタイルを追加したり、上書きすることができ、そのコントロールを使用しますます。
ユーザーコントロールを作成していない場合は、、彼らは実装が簡単です。