2009-07-30 3 views
4

이 질문은 App.xaml이보기와 별도의 어셈블리에있는 경우 App.xaml 수준에있는 리소스 사용을 처리 할 수있는 Visual Studio (2008) WPF 디자이너의 명백한 기능을 포함합니다 .다른 어셈블리의 응용 프로그램 수준 리소스

문제의 설명을 간단하게하기 위해 테스트 응용 프로그램을 만들었습니다. 이 응용 프로그램에는보기와 시작의 두 가지 어셈블리가 있습니다. View 어셈블리에는 Window1이라는 xaml 창이 포함되어 있으며 Start 어셈블리에는 App.xaml 파일이 포함되어 있습니다. 시작 어셈블리의 App.xaml 파일에는 StartupUri이 View 어셈블리의 Window1로 설정되어 있습니다. 이 파일들 중 어느 것도 표준 컨스트럭터와 InitializeComponent() 호출과는 별도로 코드 숨김을 가지고 있지 않습니다.

다음과 같이 본 실시 예에 대한 코드는 다음

App.xaml :

<Application x:Class="Start.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="pack://application:,,,/View;component/Window1.xaml" 
     > 
<Application.Resources> 

    <!-- Warning Text Style --> 
    <Style x:Key="WarningTextStyle" TargetType="TextBlock"> 
     <Setter Property="FontWeight" Value="Bold" /> 
    </Style> 

</Application.Resources> 

Window1.xaml :

<Window x:Class="View.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    Height="300" 
    Width="300" 
    > 

    <Grid> 
     <TextBlock Text="This is test text" Style="{StaticResource WarningTextStyle}" /> 
    </Grid> 
</Window> 

Window1.xaml 파일이 포함을 App-level WarningTextStyle을 참조하는 단일 TextBlock입니다. 이 코드는 Window가 App-level 리소스를 제대로 찾았 기 때문에 런타임에 잘 작동합니다. 그러나 디자인 타임에 디자이너는 WarningTextStyle을 찾을 수 없다는 불만을 표시합니다.

누구나이 문제에 대한 깨끗하고 확장 가능한 해결책을 알고 있습니까?

대용량 응용 프로그램을 사용하는 일반적인 방법은 내 응용 프로그램 수준 리소스를 리소스 사전 파일로 구성한 다음 App.xaml에서 해당 사전을 병합하는 것입니다. 위에서 설명한 문제를 해결하려면 각 리소스의 사전에 리소스 사전을 병합해야합니다. 이것은 매우 비효율적 인 것처럼 보입니다. 나중에 다른 리소스 사전을 추가하면 해당 새 사전을 모든보기에 병합해야합니다.

실버 총알 솔루션은 디자이너를 리디렉션하여 앱 수준 리소스를 찾습니다. 합리적인 해결책은 각보기에 앱 수준 리소스 사전을 병합하는 것이지만 디자인 타임에만 수행해야합니다. 런타임에 효율성 문제로 인해 모든 사전에서 이러한 사전을 병합하지 않으려합니다.

뷰의 코드 숨김 생성자에서 각 뷰의 사전을 병합 한 다음 DesignerProperties.GetIsInDesignMode() 메서드를 검사하는 if 문에서 해당 논리를 래핑하려고 시도했습니다. 그러나 Visual Studio 디자이너는 뷰의 생성자를 실행하지 않으므로이 방법은 바스 트일 수 있습니다.

누구에게 더 좋은 해결책이 있습니까?

답변

2

기본 (exe) 어셈블리의 App.xaml에서 참조 된 어셈블리 (App.xaml 또는 자신의 리소스 사전 일 수 있음)에서 리소스 사전을 병합 할 수 있습니까?

+0

Rob, 귀하의 질문을 올바르게 이해하면 사전을 하나의 사전에 병합하는 것이 좋습니다. 이는 각보기에서 각 사전을 직접 병합 할 필요가 없기 때문에 현재의 해결 방법보다 좋은 개선 사항입니다. 이 방법을 사용하여 모든 리소스를 병합하는 단일 리소스 사전 (ResourceRepository)을 만들 수 있습니다. 그런 다음 각 뷰는 각 특정 리소스 사전 대신 ResourceRepository 사전을 병합합니다.그러나 각 뷰에서 병합하는 오버 헤드는 여전히 우려 사항이라고 생각합니다. 병합의 오버 헤드는 무엇입니까? –

+0

약 20 개의 화면 크기의 사용자 컨트롤에서 200 개의 키 (모든 하위 병합을 추가 할 때) 사전을 병합합니다. 어떤 문제도 전혀 볼 수 없습니다. 조기 최적화와 그 모든 것. –

1

정적 아이디어 대신 DynamicResource를 사용했습니다. 이것은 성능 저하를 가져올 수도 있지만 측정 할 수 있을지는 의문입니다.

+0

맞아요, 그건 디자이너가 망가지는 것을 막을 것입니다. 그러나 디자이너는 런타임에 나타나는대로 뷰를 표시하지 않습니다. 단순화 된 개발을 위해 디자이너가 런타임 뷰를 정확하게 반영하는 것을 선호합니다. 그래도 좋은 제안. –

관련 문제