0

スタイル、色などのリソース ディクショナリを持つ 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 つの匿名スタイルが含まれています。ButtonToggleButton

ボタンスタイル.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と、次のようになります。EditButtonStyleButtonStyle

<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>

その後、すべてが機能します。

他のスタイルに依存するスタイルを独自のリソース ディクショナリに分離するにはどうすればよいですか?

4

1 に答える 1

1

あなたDeleteButtonStyleEditButtonStyle

  <ResourceDictionary Source="ControlStyles/DeleteButtonStyle.xaml"/>
  <ResourceDictionary Source="ControlStyles/EditButtonStyle.xaml"/>

ResourceDictionaryをロードするには、2 つのファイル内で再度明示的にマージする必要がありますButtonStyle

そう

<ResourceDictionary>
     <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Infastructure;component/ResourceDictionaries/ButtonStyle.xaml"/>
     </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
于 2014-09-23T18:38:06.997 に答える