이 질문은 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 디자이너는 뷰의 생성자를 실행하지 않으므로이 방법은 바스 트일 수 있습니다.
누구에게 더 좋은 해결책이 있습니까?
Rob, 귀하의 질문을 올바르게 이해하면 사전을 하나의 사전에 병합하는 것이 좋습니다. 이는 각보기에서 각 사전을 직접 병합 할 필요가 없기 때문에 현재의 해결 방법보다 좋은 개선 사항입니다. 이 방법을 사용하여 모든 리소스를 병합하는 단일 리소스 사전 (ResourceRepository)을 만들 수 있습니다. 그런 다음 각 뷰는 각 특정 리소스 사전 대신 ResourceRepository 사전을 병합합니다.그러나 각 뷰에서 병합하는 오버 헤드는 여전히 우려 사항이라고 생각합니다. 병합의 오버 헤드는 무엇입니까? –
약 20 개의 화면 크기의 사용자 컨트롤에서 200 개의 키 (모든 하위 병합을 추가 할 때) 사전을 병합합니다. 어떤 문제도 전혀 볼 수 없습니다. 조기 최적화와 그 모든 것. –