7

私は現在、いくつかのコンポーネントで構成されるアプリケーションを構築しています。各コンポーネントは基本的に、プラグイン システムが (MEF を使用して) 動作するように小さな C# コードを含む WPF ユーザー コントロールです。

私が抱えている問題は、各コンポーネントにアイコンを含める必要があり、見栄えを良くするためにそれを として定義したので、そこでデザインからエクスポートしSystem.Windows.Media.Brushたものを使用できることです。DrawingBrushここで、WPF 以外の C# から XAML の一部にアクセスする必要があります。現在、ユーザー コントロールをインスタンス化してリソースを要求するという恐ろしい回避策があります。

private Brush CachedIcon = null;

public override Brush Icon
{
    get
    {
        if (CachedIcon == null)
        {
            CachedIcon = (Brush)(new BlahControl().TryFindResource("Icon"));
        }
        return CachedIcon;
    }
}

そのリソース (.xaml ファイルでありResourceDictionary、カスタム コントロールで参照されている) を "通常の" C# クラスから読み取る方法が見つかりませんでした。WPF に属するものはすべてその素晴らしいTryFindResource方法を持っていますが、それ以外の場合はどうすればよいですか? アイコンが埋め込まれていないXAMLファイルを持ちたくありません。

4

4 に答える 4

2

XAML コードで、アイコン リソースのビルド オプションが "Resource" に設定されていることを確認し、リソースを参照して xaml 静的リソースにします。

<UserControl.Resources>
    <BitmapImage x:Key="icon1" UriSource="Resources/Icon1.ico" />
</UserControl.Resources>

次に、.Net 2.0 コードで、"{xamlName}.g.resource" ストリームにリソースが見つかります。

すべてのアイコンを xaml dll からディクショナリにロードするコード例:

using System.IO;
using System.Reflection;
using System.Collections;
using System.Resources;

...

var icons = new Dictionary<String, Bitmap>();
var externalBaml = Assembly.LoadFile(Path.Combine(Environment.CurrentDirectory, "MyXaml.dll"));
Stream resourceStream = externalBaml.GetManifestResourceStream(externalBaml.GetName().Name + ".g.resources");
using (ResourceReader resourceReader = new ResourceReader(resourceStream)) {
    foreach (DictionaryEntry resourceEntry in resourceReader) {
        if (resourceEntry.Key.ToString().ToUpper().EndsWith(".ICO")) {
            icons.Add(resourceEntry.Key.ToString(), Image.FromStream(resourceEntry.Value as Stream) as Bitmap);
        }
    }
}
于 2009-03-09T23:52:49.860 に答える
0

app.xaml またはマスター リソース ディクショナリ xaml ファイルのいずれかで、コントロールではなくアプリ レベルでアイコンを定義します。その後、同じ TryFindResource メソッドを使用できますが、コントロールのインスタンスを作成する必要はありません。

于 2009-03-08T17:19:33.153 に答える