itens acesso ResourceDictionary programaticamente
-
19-09-2019 - |
Pergunta
Eu tenho controles Silverlight montagem, chamados de "MySilverlightControls". Várias pastas para baixo para que a montagem tenho uma classe que estende uma coluna de grade a partir de um fornecedor de terceiros, vamos chamá-lo "MyImageColumn.cs".
Além disso, criei um dicionário de recurso chamado Generic.xaml
, este está situado na pasta Themes
do conjunto. Nesse dicionário de recursos i ter definido um ControlTemplate chamado 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>
A minha pergunta é: de MyImageColumn, como posso programaticamente referência / carregar este modelo de controle para que eu possa atribuí-la a uma propriedade na coluna? Eu esperaria estar usando uma sintaxe semelhante a esta:
ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];
mas isso retorna nulo sempre. Quando eu carregar o assembly em refletor, vejo que o arquivo Generic.xaml
está lá, o nome do recurso é MySilverlightControls.g.resources
, eo caminho dentro desse é themes/generic.xaml
.
Como exatamente posso obter para os itens individuais neste dicionário de recursos?
Solução
Got-lo resolvido.
Eu precisava:
- carregar o meu recurso dicionário
- mesclá-lo com os recursos do aplicativo
- carregar o meu modelo de controle do recurso de aplicativo
Como parte de carregar o dicionário de recurso, eu também tive que registrar o esquema de URI pack
. Eu, então, teve de lidar com algumas exceções baseados COM loucas devido a pequenos erros com o meu XAML. Eu também tive que mudar meu xaml em um arquivo de dicionário de recursos separado, tentando fazê-lo através generic.xaml manteve jogando erros (mesmo que o xaml era impecável e poderia ficar bem carregado usando o arquivo de dicionário de recursos recém-criado). Então, simplificando-a para baixo, este foi o código:
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"];
Eu afixei os pormenores para esta solução em neste blog pós .