私はあなたに不足しているリソースがあると思います。
<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
プロパティで完全に有効です。
その後、Style
はDependencyProperty.UnsetValue
が実際にButton.Foreground
プロパティに割り当てられたときにそれはだから、我々は、例外を取得Button
に適用した場合。
この問題を解決するには、ソリューション全体でProperty="Foreground"
を検索し、存在しないリソースを使用するインスタンスを探します。
DynamicResource
を使用しているときに例外が発生しないようにしてください。Button.Foreground
プロパティに渡された値が「特別な値」(遅延ルックアップを許可するため)です。この "特別な値"は、リソースが見つからない限り、指定されたプロパティを割り当てません。
問題は私が使用していたリソース辞書の悪い参照であった。 – Tyrsius
これはDynamicResourceを使用する正当な理由ですか?静的と動的のパフォーマンスの違いはありますか? – Tyrsius
@Tyrsius - いいえ、それはDynamicResourceを使用する正当な理由ではありません。 StaticResourceと比較して、それを使用するための追加のオーバーヘッドがあります。 「特別な値」は保持され、関連するリソースは実行時に再クエリできます。実際、この場合、より良いエラー報告が必要です。 – CodeNaked