누락 된 리소스가 있습니다. 다음과 같이하면 :
<Window x:Name="window" x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:WpfApplication4"
Title="MainWindow" Height="350" Width="525" >
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Foreground" Value="{StaticResource NoSuchResourceKey}" />
</Style>
</Window.Resources>
<StackPanel>
<Button Content="Click Me" />
</StackPanel>
</Window>
그런 다음 예외가 발생합니다.
<Style TargetType="Button">
<Setter Property="Foreground" Value="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type FrameworkElement}, ResourceId=NoSuchResourceKey}}" />
</Style>
문제의 원인이 여기에 몇 가지가있다 : 우리는 심지어이 예외를 생산하는 ComponentResourceKey를 사용할 수 있습니다. 일반적으로 StaticResource
을 사용할 때 리소스가 존재하지 않는다는 컴파일러 오류가 발생합니다. 이러한이 경우 같이
<Button Content="Click Me" Foreground="{StaticResource NoSuchResourceKey}" />
대신하면, 우리가했던 :
<Button Content="Click Me" Foreground="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type FrameworkElement}, ResourceId=NoSuchResourceKey}}" />
그런 다음 다른 예외 (XamlParseException)를 얻을 것, 말하는 :
이
이 '에 값을 제공 System.Windows.StaticResourceExtension '예외가 발생했습니다.' 줄 번호 '6'과 줄 위치 '22'. 의 내부를 제외
:
은 '은 TargetType = System.Windows.FrameworkElement ID = NoSuchResourceKey'라는 이름의 자원을 찾을 수 없습니다. 자원 이름은 대소 문자를 구분합니다.
실제 문제 (누락 된 리소스)가 있습니다. 처음 두 예제가 우리에게 유용한 예외를주지 않는 이유는 Foreground
속성을 설정하지 않기 때문입니다. Setter
개체에 Value
속성을 설정하고 있습니다. 따라서 자원을 찾을 수 없으면 DependencyProperty.UnsetValue
이 사용됩니다. 어떤 Setter.Value
속성에 대해 완벽하게 유효합니다.
나중에 Style
은 DependencyProperty.UnsetValue
실제로 Button.Foreground
속성에 할당 될 때이기 때문에 우리가, 예외를 얻을 Button
에 적용됩니다.
이 문제를 해결하려면 전체 솔루션을 Property="Foreground"
으로 검색하고 존재하지 않는 리소스를 사용하는 인스턴스를 찾아야합니다.
DynamicResource
을 사용할 때 예외가 발생하지 않는다는 점을 추가해야합니다. Button.Foreground
속성에 전달 된 값이 "특수 값"(지연된 조회 허용)이기 때문입니다. 이 "특수 값"은 자원이 발견되지 않으면 주어진 속성을 할당하지 않습니다.
문제는 내가 사용하고있는 리소스 사전에서 나쁜 참조가되었습니다. – Tyrsius
DynamicResource를 사용하는 것이 그 이유입니까? 정적과 동적의 성능 차이가 있습니까? – Tyrsius
@Tyrsius - 아니요. DynamicResource를 사용하는 것이 좋은 이유는 아닙니다. StaticResource와 비교할 때 추가 오버 헤드가 있습니다. "특수 값"은 유지되며 런타임 중에 연관된 자원을 다시 쿼리 할 수 있습니다. 실제로이 경우 더 나은 오류보고가 필요합니다. – CodeNaked