2011-10-28 22 views
4

私は本当にここにいなくなり、数時間にわたってこれに対する解決策を見つけようとしています。迷っています。前回チェックしたときに動作していた操作中に次の例外が発生しました。Visual Studioソースがありません

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

これは、エラーが発生している場所に私を取ることはありません。 「No Source Available」と言うページに移動します。私はさまざまな場所にブレークポイントを配置することでエラーの位置を特定しようとしましたが、実行ごとに異なるポイントで失敗するようです。 InnerExceptionはnullです。

私はthis questionと、Googleのさまざまな記事を見ました。私は何が起こっているのか理解できず、私はここからトラブルシューティングする方法を知らない。 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> 

次に、このような例外が発生します。 ComponentResourceKeyを使用してこの例外を生成することもできます:

<Style TargetType="Button"> 
    <Setter Property="Foreground" Value="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type FrameworkElement}, ResourceId=NoSuchResourceKey}}" /> 
</Style> 

ここには問題を引き起こすものがいくつかあります。通常、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' という名前のリソースを見つけることができません。リソース名は大文字と小文字を区別します

実際の問題(リソースが不足しています)につながります。最初の2つの例が有用な例外を与えない理由は、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