스타일, 색상 등에 대한 리소스 사전이있는 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}"/>
Button
과 ToggleButton
이 잘 작동합니다. 모든 Button
및 ToggleButton
s 스타일에 적용됩니다.
DeleteButtonStyle
및 EditButtonStyle
과 같이 많이 사용되는 두 개의 다른 단추 스타일이 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)에 DeleteButtonStyle
및 EditButtonStyle
를 이동하는 경우
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
에서
참고. 이것은 작동하지만 디자인 타임에 작동하는 xaml이 런타임에도 작동한다면 정말 좋을 것입니다. – CurtisHx
런타임에 디자인 타임에 작동 시키려면'DynamicResource'를 사용할 수 있습니다. StaticResource는 바로 찾으려고합니다. 그래서 App.xaml에서 찾을 수있는 DynamicResource 대 –
반대의 문제가 있습니다. XAML은 디자인 타임에 작동하지만 위의 예외는 런타임에 throw됩니다. XAML은'BasedOn' 속성이'DynamicResource'를 따르는 것을 허용하지 않습니다. 내 질문을 되돌아 보면, 내가 그걸 중간에 묻어 버린 것 같습니다. – CurtisHx