ResourceDictionary アイテムにプログラムでアクセスする
-
19-09-2019 - |
質問
「MySilverlightControls」という Silverlight コントロール アセンブリがあります。そのアセンブリのいくつかのフォルダーには、サードパーティ ベンダーのグリッド列を拡張するクラスがあります。これを「MyImageColumn.cs」と呼びます。
というリソース辞書も作成しました。 Generic.xaml
, 、これはに位置しています Themes
アセンブリのフォルダー。そのリソース ディクショナリでは、ControlTemplate という名前の 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"];
ただし、これは常に null を返します。Reflector にアセンブリをロードすると、 Generic.xaml
ファイルが存在し、リソースの名前が MySilverlightControls.g.resources
, 、その中のパスは themes/generic.xaml
.
このリソース ディクショナリ内の個々の項目に正確にアクセスするにはどうすればよいですか?
解決
解決しました。
次のことが必要でした:
- リソース辞書をロードする
- それをアプリケーションのリソースとマージします
- アプリケーション リソースからコントロール テンプレートをロードします
リソース ディクショナリの読み込みの一環として、 pack
URI スキーム。その後、xaml のわずかなエラーにより、いくつかのクレイジーな COM ベースの例外に対処する必要がありました。また、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"];
このソリューションの詳細は次のとおりです。 このブログ投稿.