2014-09-23 2 views
0

스타일, 색상 등에 대한 리소스 사전이있는 C# MEF/Caliburn.Micro 응용 프로그램에서 작업하고 있습니다. 각 스타일에 해당 스타일을 지정하려고합니다. 다른 리소스 사전의 스타일을 기반으로하는 스타일에 문제가 있습니다. 모든 응용 프로그램의 광범위한 리소스는 으로 병합 된 Infastructure 프로젝트에 있습니다.WPF 다른 스타일에 의존하는 스타일을 자체 리소스 사전으로 구분

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 및 mai를 적용하는 두 개의 익명 스타일 n 버튼 스타일 ButtonStyle.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}"/> 

ButtonToggleButton

이 잘 작동합니다. 모든 ButtonToggleButton s 스타일에 적용됩니다.

DeleteButtonStyleEditButtonStyle과 같이 많이 사용되는 두 개의 다른 단추 스타일이 ButtonStyle이어야합니다. 다음은 DeleteButtonStyle.xaml에서 가져온 코드입니다. EditButtonStyle도 비슷합니다.

<Style x:Key="DeleteButtonStyle" TargetType="{x:Type ButtonBase}" BasedOn="{StaticResource ButtonStyle}"> 
.... 
</Style> 

모든 것은 디자인 타임에 작동합니다. 단추는 ButtonStyle 스타일을 가지며 ...Style="{DynamicResource DeleteButtonStyle}"...으로 명시 적으로 표시된 단추는 DeleteButtonStyle이 적용됩니다. 그때 너무

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

모든처럼 ButtonStyle이 같은 파일 (ButtonStyle.xaml)에 DeleteButtonStyleEditButtonStyle를 이동하는 경우

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: 

그러나, 실행 시간에, 난 항상 다음과 같은 예외를 얻을 공장.

다른 스타일에 의존하는 스타일을 자체 리소스 사전으로 분리하려면 어떻게합니까? 당신의 DeleteButtonStyle에서

답변

1

EditButtonStyle

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

명시 적으로 ButtonStyle를로드하는 두 개의 파일 안에 다시 ResourceDictionary 병합해야합니다.

그래서 기대했다,하지만 여전히 하나 개의 거대한 자원 파일보다 청소기의 매우 무엇

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/Infastructure;component/ResourceDictionaries/ButtonStyle.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 
+0

참고. 이것은 작동하지만 디자인 타임에 작동하는 xaml이 런타임에도 작동한다면 정말 좋을 것입니다. – CurtisHx

+0

런타임에 디자인 타임에 작동 시키려면'DynamicResource'를 사용할 수 있습니다. StaticResource는 바로 찾으려고합니다. 그래서 App.xaml에서 찾을 수있는 DynamicResource 대 –

+0

반대의 문제가 있습니다. XAML은 디자인 타임에 작동하지만 위의 예외는 런타임에 throw됩니다. XAML은'BasedOn' 속성이'DynamicResource'를 따르는 것을 허용하지 않습니다. 내 질문을 되돌아 보면, 내가 그걸 중간에 묻어 버린 것 같습니다. – CurtisHx

관련 문제