スタイル、色などのリソース ディクショナリを持つ C# MEF/Caliburn.Micro アプリケーションに取り組んでいます。各スタイルに独自のファイルを与えようとしていますが、ベースのスタイルで問題が発生しています。他のリソース ディクショナリのスタイルについて。アプリケーション全体のリソースはすべてInfastructure
プロジェクトに存在し、 にマージされApp.xaml
ます。
私のソリューションのレイアウトは次のとおりです。
Solution
->Shell
App.xaml
(other shell-related files)
->Infastructure
->ResourceDictionaries
->Brushes
DefaultColorTheme.xaml
->ControlStyles
ButtonStyle.xaml
DeleteButtonStyle.xaml
EditButtonStyle.xaml
ResourceLibrary.xaml
ResourceLibrary.xaml は、ResourceDictionaries フォルダー内のすべてのリソース ディクショナリのマージです。
ResourceLibrary.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Brushes/DefaultColorTheme.xaml"/>
<ResourceDictionary Source="ControlStyles/ButtonStyle.xaml"/>
<ResourceDictionary Source="ControlStyles/DeleteButtonStyle.xaml"/>
<ResourceDictionary Source="ControlStyles/EditButtonStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
ResourceLibrary.xaml が App.xaml にマージされる
App.xaml
<Application...
>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Infastructure;component/ResourceDictionaries/ResourceLibrary.xaml"/>
<ResourceDictionary>
<local:Bootstrapper x:Key="Bootstrapper"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
ButtonStyle.xaml には、 をターゲットとするメイン ボタン スタイルと、メイン ボタン スタイルをおよびButtonBase
に適用する 2 つの匿名スタイルが含まれています。Button
ToggleButton
ボタンスタイル.xaml
<Style x:Key="ButtonStyle" TargetType="{x:Type ButtonBase}">
...
</Style>
<Style BasedOn="{StaticResource ButtonStyle}" TargetType="{x:Type Button}"/>
<Style BasedOn="{StaticResource ButtonStyle}" TargetType="{x:Type ToggleButton}"/>
これはうまくいきます。get 内のすべてButton
の およびToggleButton
にスタイルが適用されます。
アプリケーションで頻繁に使用されるボタン スタイルが他に 2 つDeleteButtonStyle
ありEditButtonStyle
、これらは に基づく必要がありますButtonStyle
。以下は、DeleteButtonStyle.xaml のコード スニップです。EditButtonStyle も同様です。
<Style x:Key="DeleteButtonStyle" TargetType="{x:Type ButtonBase}" BasedOn="{StaticResource ButtonStyle}">
....
</Style>
すべてが設計時に機能します。ボタンはスタイルを取得し、ButtonStyle
で明示的にマークされたボタンはそれらに適用されます。ただし、実行時には常に次の例外が発生します。...Style="{DynamicResource DeleteButtonStyle}"...
DeleteButtonStyle
System.Windows.Markup.XamlParseException occurred
HResult=-2146233087
Message='Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.' Line number '4' and line position '35'.
Source=PresentationFramework
LineNumber=4
LinePosition=35
StackTrace:
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
...
InnerException:
HResult=-2146233088
Message=Cannot find resource named 'ButtonStyle'. Resource names are case sensitive.
Source=PresentationFramework
StackTrace:
at System.Windows.StaticResourceExtension.ProvideValueInternal(IServiceProvider serviceProvider, Boolean allowDeferredReference)
at System.Windows.StaticResourceExtension.ProvideValue(IServiceProvider serviceProvider)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider)
InnerException:
同じファイル(ButtonStyle.xaml)に移動するDeleteButtonStyle
と、次のようになります。EditButtonStyle
ButtonStyle
<Style x:Key="ButtonStyle" TargetType="{x:Type ButtonBase}">
...
</Style>
<Style BasedOn="{StaticResource ButtonStyle}" TargetType="{x:Type Button}"/>
<Style BasedOn="{StaticResource ButtonStyle}" TargetType="{x:Type ToggleButton}"/>
<Style x:Key="DeleteButtonStyle" TargetType="{x:Type ButtonBase}" BasedOn="{StaticResource ButtonStyle}">
....
</Style>
<Style x:Key="EditButtonStyle" TargetType="{x:Type ButtonBase}" BasedOn="{StaticResource ButtonStyle}">
....
</Style>
その後、すべてが機能します。
他のスタイルに依存するスタイルを独自のリソース ディクショナリに分離するにはどうすればよいですか?