Программный доступ к элементам ResourceDictionary
-
19-09-2019 - |
Вопрос
У меня есть сборка элементов управления Silverlight под названием «MySilverlightControls».В нескольких папках этой сборки у меня есть класс, который расширяет столбец сетки от стороннего поставщика, назовем его «MyImageColumn.cs».
Я также создал словарь ресурсов под названием Generic.xaml
, это находится в Themes
папка сборки.В этом словаре ресурсов я определил ControlTemplate под названием MyImageColumnTemplate:
<ControlTemplate x:Name="MyImageColumnTemplate" >
<Grid Margin="8,8,4,4" MaxHeight="32" MaxWidth="32">
<Grid.Resources>
<localGrid:StatusColumnImageConverter x:Key="ImageContentConverter"/>
</Grid.Resources>
<Border Margin="5,5,0,0" Background="Black" Opacity="0.15" CornerRadius="5" />
<Border Background="#FF6E6E6E" CornerRadius="4,4,4,4" Padding="4" Margin="0,0,5,5">
<Border Background="White" CornerRadius="2,2,2,2" Padding="3">
<Image Source="{Binding EditValue, Converter={StaticResource ImageContentConverter}}" Stretch="Uniform"/>
</Border>
</Border>
</Grid>
</ControlTemplate>
Мой вопрос:из MyImageColumn, как я могу программно ссылаться/загружать этот шаблон элемента управления, чтобы я мог назначить его свойству в столбце?Я ожидаю использовать синтаксис, подобный этому:
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];
но это всегда возвращает ноль.Когда я загружаю сборку в Reflector, я вижу, что Generic.xaml
файл есть, имя ресурса есть MySilverlightControls.g.resources
, и путь внутри него themes/generic.xaml
.
Как именно я могу получить доступ к отдельным элементам в этом словаре ресурсов?
Решение
Разобрался.
Я нуждался в:
- загрузить мой словарь ресурсов
- объединить его с ресурсами приложения
- загрузить мой шаблон управления из ресурса приложения
В рамках загрузки словаря ресурсов мне также пришлось зарегистрировать pack
Схема URI.Затем мне пришлось столкнуться с некоторыми сумасшедшими исключениями на основе COM из-за небольших ошибок в моем xaml.Мне также пришлось переместить мой xaml в отдельный файл словаря ресурсов, пытаясь сделать это через generic.xaml, который продолжал выдавать ошибки (хотя xaml был безупречен и мог нормально загружаться с использованием вновь созданного файла словаря ресурсов).Итак, упрощая это, это был код:
if (!UriParser.IsKnownScheme("pack"))
UriParser.Register(new GenericUriParser(GenericUriParserOptions.GenericAuthority), "pack", -1);
ResourceDictionary dict = new ResourceDictionary();
Uri uri = new Uri("/MySilverlightControls;component/themes/Dictionary1.xaml", UriKind.Relative);
dict.Source = uri;
Application.Current.Resources.MergedDictionaries.Add(dict);
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];
Я разместил полную информацию об этом решении в этот пост в блоге.