Какова область действия StaticResource в WPF ResourceDictionary? - PullRequest
12 голосов
/ 21 апреля 2010

У меня есть WPF ResourceDictionary со следующим TextBlock:

<TextBlock Visibility="{Binding Converter={StaticResource MyBoolProp ResourceKey=BoolToVis}}">
</TextBlock>

ResourceDictionary включен в App.xaml в MergedDictionaries:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyResourceDictionary.xaml"/>

В App.xaml я определил конвертер BoolToVis (опять же, под Application.Resources)

<BooleanToVisibilityConverter x:Key="BoolToVis" />

Когда я запускаю свое приложение - я получаю следующее исключение XamlParseException:

"Укажите значение на 'System.Windows.Markup.StaticResourceHolder' бросил исключение. "

InnerException:

"Невозможно найти ресурс с именем BoolToVis. Имена ресурсов чувствительны к регистру."

Я могу ссылаться на этот конвертер напрямую с помощью App.xaml (фактически, конкретное объявление XAML идентично) и в других элементах UserControls без проблем.

Этот конкретный фрагмент кода также отлично работал под .NET 4.0 RC (и Beta2). Эта ошибка начиналась только при обновлении до .NET 4.0 RTM.

Я могу обойти это, объявив еще один BooleanToVisibilityConverter в MyResourceDictionary.xaml и ссылаясь на него примерно так:

<TextBlock Visibility="{Binding Converter={StaticResource MyBoolProp ResourceKey=BoolToVis2}}">
</TextBlock>

Любая причина, почему я должен сделать это?

1 Ответ

8 голосов
/ 21 апреля 2010

за MSDN :

Ресурсы в объединенном словаре занимают место в области поиска ресурсов, которое находится сразу после области основного словаря ресурсов, в которую они объединяются.

Ресурсы, определенные в App.xaml, не могут быть видны объединенным ResourceDictionary. Я думаю, что имеет больше смысла определять конвертер, используемый в ResourceDictionary в самом ResourceDictionary, или другой ResourceDictionary, который содержит все ваши конвертеры.

...