2013-03-13 2 views
3

다음은 시나리오입니다.응용 프로그램 전체 자원을 어떻게 구성해야합니까?

저는 VS 2010을 사용하여 MEF를 사용하여 상당히 큰 WPF 프로젝트를 작성했습니다. 이 솔루션에는 여러 프로젝트가 있으며 모든 스타일에 대해 하나의 ResourceDictionary이 있습니다.

AppStyles.xamlResourceDictionary은 내 시작 프로젝트에 있으며 프로젝트의 모든 스타일을 포함합니다. 그리고 내 App.xaml에서 나는 다음과 같습니다

<Application x:Class="Dionysus.Shell.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     DispatcherUnhandledException="UnhandledException" ShutdownMode="OnMainWindowClose"> 
<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 

      <ResourceDictionary Source="AppStyles.xaml"/> 

    </ResourceDictionary> 
</Application.Resources> 

이제 완벽하게 디자인 VS 2010 모드 때 디버깅하고이 모든 작품, 올바른 스타일은 내 모든 컨트롤에 적용되고있다. 하지만 최근에 VS 2012로 전환했는데 디자이너가 더 이상 작동하지 않습니다! 내가 디버깅 할 때 완벽하게 작동하지만 내 스타일 중 하나를 사용할 때마다 다음과 같이

<Button Name="btnForward" Height="23" Margin="10,0" Style="{StaticResource DionysusButton}" Grid.Row="2" Grid.Column="0"/> 

내가 얻을 VS 2012 디자이너에서 다음과 같은 오류 :

The resource "DionysusButton" could not be resolved. 

나는이는 이유에 우둔입니다 일어나, 나는 Style, 심지어는 ResourceDictionary의 이름을 바꿨다.

VS 2012에서이 작업을 수행해야하는 다른 방법이 있습니까? 아니면 VS 2012에서 문제가 있습니까?

나는 나의 AppStyles.xamlResourceDictionaryx:Key에의 x:Name 속성을 변경하면이 문제를 해결할 수 있지만,이 ResourceDictionary에 대한 유효한 옵션이 아닙니다으로 내가 그렇게 할 수 없다고 말할 게시물을 많이 발견했다. 사전

에서

고맙습니다 - UPDATE

을 나는 마크의 답변을 사용하고 모든 기본 스타일을 제외하고는 잘되어 가고있는 것 같다. 나는 다음과 같은 스타일이 있습니다

<Style TargetType="DataGrid" x:Name="DataGridStyle"/> 

을 그리고 이것은 내 주요 ResourceDictionary입니다 :

<ResourceDictionary x:Name="Main" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 


<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Styles/AppStyling.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

<Style TargetType="DataGrid" BasedOn="{StaticResource DataGridStyle}"/> 

나는 그것이 잘 작동 ResourceDictionary 내 주요의 Style 태그를 추가 할 수 있지만하지 않는 스타일 분명히 모든 항목에 적용되지 않습니다.

가 'System.Windows.Markup.StaticResourceHolder'에 대한 값을 제공 예외

아이디어를 던졌다 : 나는 그것을 추가 할 때, 나는 다음과 같은 예외가?

+0

당신은'x : Name'을 언급했지만 그것이 어디에 관련이 있는지 말하지는 않습니다 - 여러분의 코드에서 언급되지 않았습니다. 당신도 왜 그렇게 할 수 없는지 말하지 않습니다. –

+0

죄송합니다! 나는 내 질문을 업데이트했다. –

+0

아니, 생각. 내가 볼 수있는 한 모든 것이 잘 보입니다. 예외는 모두 및 아무것도 아닙니다. DataGridStyle이 비어 있거나 뭔가 잘못되었을 수 있습니까? 주요 사전의 x : Name을 제거하십시오. 어쨌든 그것을 필요로하지 않아야합니다 ... – Marc

답변

2

PRISM을 사용하여 쉘로 내보내는 모듈의 app.xaml에있는 스타일을 사용하려고합니까? 모듈에는 응용 프로그램/셸 프로젝트 (시작 프로젝트)에 대한 참조가 없어야합니다. 그러면 스타일을 포함하고있는 프로젝트를 '알지 못한다'는 말입니까? 질문이 VS2010에서 작동하는 이유는 무엇입니까 ... 제발 알려주세요. MEF 시나리오를 잘못 이해하면 그에 대한 답을 수정 해드립니다.

리소스 및 프리즘은 까다 롭고 이전에 게시 한 다음 접근 방식에 대한 팬이지만 본인의 경우에도 도움이 될 수 있습니다. PRISM 솔루션은 app.xaml에 리소스를 배치하는 것보다 훨씬 적합합니다.

보통 스타일을 지정하려는 프로젝트에서 참조하는 별도의 스타일 프로젝트를 만듭니다. 나는 스타일 ResourceDictionary을 생성, 모든 제어를 위해

Styling project

: 유행에 따라 디자인하는 프로젝트는 다음과 같이 고정 된 구조를 가지고있다. 내 버튼의 예를 들면 다음과 같습니다

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:controls="clr-namespace:Commons.Controls;assembly=Commons"> 

    <ResourceDictionary.MergedDictionaries> 

     <ResourceDictionary Source="Converter/Converter.xaml" /> 
     <ResourceDictionary Source="Styles/Button.xaml" /> 
     <ResourceDictionary Source="BitmapGraphics/Icons.xaml" /> 

    </ResourceDictionary.MergedDictionaries> 

    <!-- Default Styles --> 
    <Style TargetType="Button" BasedOn="{StaticResource PrimaryButtonStyle}"></Style> 
</ResourceDictionary> 
: 하나의 주 ResourceDictionary에서

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="PrimaryButtonStyle" TargetType="Button"> 
    </Style> 

    <Style x:Key="ToolbarButton" TargetType="Button"> 
     <Setter Property="BorderThickness" Value="0" /> 
     <Setter Property="Margin" Value="3"/> 
     <Setter Property="Background" Value="Transparent"></Setter> 
    </Style> 
</ResourceDictionary> 

, 난 당신이 위의 그림에서 볼 수있는 파일 IncaDesign.xaml,이 경우에, 다른 모든 사전을 병합

달리 지정하지 않는 한 자동으로 적용되는 기본 스타일을 어떻게 정의했는지 확인하십시오. 스타일을 지정하려는 모든 창이나 컨트롤에서이 하나만 참조하면됩니다 ResourceDictionary. 기본 스타일이 자동으로 설정됩니다

<UserControl.Resources>   
    <ResourceDictionary>    
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Commons.Styling;component/IncaDesign.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <!-- Here you can added resources which belong to the UserControl only --> 
     <!-- For example: --> 
     <DataTemplate x:Kex="UcTemplate" /> 
    </ResourceDictionary>   
</UserControl.Resources> 

어셈블리 (/Commons.Styling;component...)에 대한 참조 소스의 정의를 참고, 당신은 명시 적으로 리소스에 액세스하려는 경우, 당신은 StaticResource를 사용하여이 작업을 수행 할 수 있습니다.

<Viewbox Height="16" Width="16" Margin="0,0,10,0"> 
    <ContentControl Content="{StaticResource FileIcon32}" /> 
</Viewbox> 

이것은 PRISM과 같은 모듈 형 솔루션을 포함하여 매우 복잡한 솔루션에 적합한 제 생각에는 매우 훌륭한 솔루션입니다.

+0

특정 프로젝트의 스타일을 구분할 때이 솔루션을 많이 사용하는 것처럼 마음에 들지 않습니다. 모든 컨트롤에 'UserControl.Resources'를 추가해야한다는 것입니다. 신청! Thanx a lot –

+0

많은 컨트롤에서 이미' '요소가 있으므로,'ResourceDictionary'를'ResourceDictionary'에 추가하면'x : Key '그것을 위해, 그러나 내가 스타일링이 작동하지 않을 때, 나는이 경우 어떻게해야합니까? –

+1

안녕하세요, 저는 솔루션을 좋아해서 기쁩니다. UserControls에 이미 ResourceDictionary가 있으면 MergedDictionary에 대한 참조를 추가하는 세 줄을 추가하기 만하면됩니다. 나는 대답을 편집 할 것이고, 세번째 코드 목록에 주석을 적는다. – Marc

관련 문제