В библиотеке WPF у меня есть файл словаря ресурсов с некоторыми шаблонами, которые нужно найти по ключу и использовать в качестве содержимого некоторого элемента управления:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:DbEditor.Converters"
x:ClassModifier="internal"
x:Class="DbEditor.Components.ScalarHandlers"
>
<Grid x:Key="stringEditor" x:Shared="False">
<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding IsReadOnly}"></TextBox>
</Grid>
<Grid x:Key="intEditor" x:Shared="False">
<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" PreviewTextInput="IntTextBox_PreviewTextInput" IsEnabled="{Binding IsReadOnly}"></TextBox>
</Grid>
...
</ResourceDictionary>
Я нахожу один из шаблонов по ключу так:
var scalarDictionary = new ResourceDictionary();
scalarDictionary.Source = new Uri("/DbEditor;component/Components/Scalar.xaml", UriKind.RelativeOrAbsolute);
var pair = scalarDictionary.OfType<DictionaryEntry>().FirstOrDefault(x => (string)x.Key == key);
return pair.Value as FrameworkElement;
Но добавленный один раз к какому-то элементу управления, элемент нельзя использовать в другом месте. Раньше эти шаблоны хранились в ресурсах App.xaml и имели атрибут x: Shared = "False", который позволял использовать их много раз. Теперь добавление атрибута x: Shared приводит к ошибке времени выполнения.
"Shared attribute in namespace 'http://schemas.microsoft.com/winfx/2006/xaml' can be used only in compiled resource dictionaries."
Я не нашел способа скомпилировать словарь ресурсов. Изменение действия сборки для файла .xaml со страницы на ресурсы, встроенные ресурсы или компиляцию ничего не меняет.
Есть ли способ загрузить элементы управления из ResourceDictionary во время выполнения по ключу и использовать их более одного раза?