Программный доступ к элементам ResourceDictionary - PullRequest
16 голосов
/ 09 января 2010

У меня есть сборка элементов управления 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.

.

Как именно я могу получить отдельные элементы в этом словаре ресурсов?

1 Ответ

30 голосов
/ 10 января 2010

Понял.

Мне нужно было:

  • загрузить мой словарь ресурсов
  • объединить его с ресурсами приложения
  • загрузить мой шаблон управления из ресурса приложения

В процессе загрузки словаря ресурсов мне также пришлось зарегистрировать схему 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"];

Я разместил полную информацию об этом решении в этом сообщении в блоге .

...