Я хочу быть, у вас есть пропавший ресурс. Если вы делаете что-то вроде:
<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'. Имена ресурсов чувствительны к регистру.
Что все приводит нас к реальной проблеме (отсутствующий ресурс). Причина, по которой первые два примера не дают нам полезного исключения, заключается в том, что мы не устанавливаем свойство Foreground
. Мы устанавливаем свойство Value
для объекта Setter
. Поэтому, когда ресурс не найден, используется DependencyProperty.UnsetValue
. Что совершенно верно для свойства Setter.Value
.
Позже, когда Style
применяется к Button
, мы получаем исключение, потому что именно тогда DependencyProperty.UnsetValue
фактически присваивается свойству Button.Foreground
.
Чтобы исправить эту проблему, я бы по всему вашему решению выполнил поиск Property="Foreground"
и нашел бы все экземпляры, которые используют ресурс, который не существует.
Я должен добавить, что вы не получите исключение при использовании DynamicResource
, потому что в этом значении, переданном свойству Button.Foreground
, есть «специальное значение» (которое позволяет отложить поиск). Это «специальное значение» не будет назначать данное свойство, если ресурс не найден.