16

「MySilverlightControls」と呼ばれる Silverlight コントロール アセンブリがあります。そのアセンブリのいくつかのフォルダーの下に、サード パーティ ベンダーのグリッド列を拡張するクラスがあります。これを「MyImageColumn.cs」と呼びましょう。

という名前のリソース ディクショナリも作成しましたGeneric.xaml。これはThemes、アセンブリのフォルダにあります。そのリソース ディクショナリで、 MyImageColumnTemplateという ControlTemplate を定義しました。

<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

このリソース ディクショナリ内の個々の項目に正確にアクセスするにはどうすればよいですか?

4

1 に答える 1

30

解決しました。

私はする必要がありました:

  • リソース ディクショナリを読み込む
  • それをアプリケーションのリソースとマージします
  • アプリケーション リソースからコントロール テンプレートを読み込む

リソース ディクショナリの読み込みの一環として、packURI スキームも登録する必要がありました。次に、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"];

このソリューションの詳細については、このブログ投稿に投稿しています。

于 2010-01-10T12:17:18.143 に答える