2011-10-28 4 views
4

저는 여기에 분실했습니다. 몇 시간 동안이 문제에 대한 해결책을 찾으려고했습니다. 나는 길을 잃었다. 마지막으로 확인한 작업 중에 다음 예외가 발생합니다.Visual Studio 소스를 사용할 수 없음

'{DependencyProperty.UnsetValue}' is not a valid value for property 'Foreground'.

이 오류가 발생하는 위치를 이동하지 않습니다. "No Source Available"이라고 표시된 페이지로 이동합니다. 내가 여러 위치에 중단 점을 배치하여 오류를 찾으려고했지만 각 실행을 통해 다른 지점에서 실패하는 것 같습니다. InnerException은 null입니다.

나는 Google에서 다양한 기사뿐만 아니라 this question을 보았습니다. 무슨 일이 일어나고 있는지 알 수 없으며 여기에서 문제를 해결하는 방법을 모르겠습니다. Visual Studio 출력에 더 자세한 정보는 표시되지 않지만 요청시 붙여 넣습니다. 제발, 어떤 도움을 주셔서 감사합니다.

답변

6

누락 된 리소스가 있습니다. 다음과 같이하면 :

<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 속성에 대해 완벽하게 유효합니다.

나중에 StyleDependencyProperty.UnsetValue 실제로 Button.Foreground 속성에 할당 될 때이기 때문에 우리가, 예외를 얻을 Button에 적용됩니다.

이 문제를 해결하려면 전체 솔루션을 Property="Foreground"으로 검색하고 존재하지 않는 리소스를 사용하는 인스턴스를 찾아야합니다.

DynamicResource을 사용할 때 예외가 발생하지 않는다는 점을 추가해야합니다. Button.Foreground 속성에 전달 된 값이 "특수 값"(지연된 조회 허용)이기 때문입니다. 이 "특수 값"은 자원이 발견되지 않으면 주어진 속성을 할당하지 않습니다.

+0

문제는 내가 사용하고있는 리소스 사전에서 나쁜 참조가되었습니다. – Tyrsius

+0

DynamicResource를 사용하는 것이 그 이유입니까? 정적과 동적의 성능 차이가 있습니까? – Tyrsius

+0

@Tyrsius - 아니요. DynamicResource를 사용하는 것이 좋은 이유는 아닙니다. StaticResource와 비교할 때 추가 오버 헤드가 있습니다. "특수 값"은 유지되며 런타임 중에 연관된 자원을 다시 쿼리 할 수 ​​있습니다. 실제로이 경우 더 나은 오류보고가 필요합니다. – CodeNaked

1

프로젝트를 리빌드 했습니까? 귀하의 PDB 파일이 귀하의 DLL과 일치하지 않을 수 있으므로 VS가 파일을로드하지 않을 수 있습니다. 오류 자체에 대해서는 Foreground 속성에 대한 바인딩이 잘못되어있는 것 같습니다.

+0

이것은 제가 시도한 한 걸음이었습니다. 결과가 바뀌지 않았습니다. – Tyrsius

관련 문제