ほとんどのウィンドウの派生元となる基本ウィンドウ クラスを作成中です。明らかに、これに対する最善の解決策は、別のクラスとそれに適用されるスタイルでした。
問題は、<Style ../>
私が持っている が にあるときに適用されないことですApp.Resources
。つまり、外部ResourceDictionary
で定義されていて のリソースにマージされてApp.xaml
いるか、ローカル ディクショナリにマージまたはインラインで配置されている場合App.Resources
です。<Style ../>
ただし、 は に配置されたときに適用されますThemes/Generic.xaml
。
この問題は、ベース ウィンドウで何も特別なことをしなくても実証できますDefaultStyleKeyProperty
。.
以下はThemeWindow
:
public class ThemeWindow : Window
{
static ThemeWindow()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ThemeWindow), new FrameworkPropertyMetadata(typeof(ThemeWindow)));
}
}
<Style ../>
これは私が適用しようとしている非常に単純なものです(Window
背景が赤くなり、それ以上のものはありません):
<Style TargetType="{x:Type testing:ThemeWindow}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type testing:ThemeWindow}">
<Grid>
<Grid.Background>
<SolidColorBrush Color="Red"/>
</Grid.Background>
<AdornerDecorator>
<ContentPresenter />
</AdornerDecorator>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
MainWindow
を使用する は、ThemeWindow
単純に次の XAML です。
<testing:ThemeWindow x:Class="Testing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:testing="clr-namespace:Testing"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="125,83,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
</testing:ThemeWindow>
さて、述べたようにStyle
、それを独自のに配置し、次のResourceDictionary
ように含めると:
<App.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Themes/ThemeWindow.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</App.Resources>
.. それは動作しません。スタイルを に直接インライン化するApp.Resources
と、機能しません。
動作していることがわかる唯一の状況は、 ResourceDictionary
xamlを呼び出して、アプリケーションのディレクトリにGeneric.xaml
配置することです。Themes/
なぜこれが起こっているのか、私は正確に疑問に思っています。
私の唯一の理論は、WPF がコントロール タイプを検出すると、 に向かい、そのタイプのThemes
すべての をスキャンしてから、ResourceDictionary
フォールバックしGeneric.xaml
てロードするというものです。<Style />
ただし、マージされた が利用可能な場合にロードされない理由は説明されていませんResourceDictionary
。明らかな理由から、 を に配置すると機能することに注意してください。MergedDictionary
Generic.xaml
それが私がしなければならないことである場合、私はにマージResourceDictionary
しGeneric.xaml
なければならないことに完全に問題ありません。なぜこのようにする必要があるのかについて、技術的な詳細に取り掛かりたいと思います。
これが機能しない/機能するスクリーンショット: