クライアントごとにカスタマイズできるようにするアプリケーションを WPF (.Net 3.5) で作成しています。リソースを外部の xaml (テーマ) ファイルに抽象化しました。として構築されたxamlファイルを使用するPage
と、これは完璧に機能します。
XamlReader
今、テーマの xaml ファイルを動的にロードするために使用したいと考えています。このようにして、私がアプリケーションをコンパイルし、他の人が (クライアントごとに) アプリをカスタマイズできます。再コンパイルやソース コードへのアクセスは必要ありません。これが私がやっていることのスナップショットです:
Directory.GetFiles(pathToThemeDirectory).Each((file) =>
{
using (Stream stream = new FileStream(file, FileMode.Open))
{
var dir = Directory.GetCurrentDirectory();
var dict = XamlReader.Load(stream) as ResourceDictionary;
Application.Current.Resources.MergedDictionaries.Add(dict);
}
});
これで、Xaml が正しく解析されるようになりました。ただし、次のようなエラーが表示されるようになりました。
Cannot convert string '/Path/To/Image/File.ico' in attribute 'Icon' to object of
type 'System.Windows.Media.ImageSource'. Cannot locate resource
'/Path/To/Image/File.ico'. Error at object 'System.Windows.Setter'
クライアントごとにこれらのリソース (ロゴ画像など) を変更できるようにしたいので、ビルド アクションを からResource
に変更None
し、常に出力ディレクトリにコピーするように指示しました。
実行時に Xaml を解析し、構成を変更して、アセンブリでコンパイルする必要のないイメージ リソースを取得する方法について何か提案はありますか? または、私は完全にベースから外れており、このテーマのカスタマイズを実現するためのより良い方法はありますか?
アップデート:
エラーが発生している正確な行は次のとおりです。
<Style x:Key="MainWindow">
<Setter Property="Window.Icon" Value="/Assets/icon.ico" />
</Style>
しかし、それはこれがロードされた最初のアセットだからです。別の例を次に示します。
<ImageBrush x:Key="NavigationBackgroundImage" ImageSource="Assets/bg.png" TileMode="Tile" Stretch="UniformToFill"/>
これらは、次の方法でアクセスするスタイルで使用されます。
{StaticResource MainWindow}
また
{StaticResource NavigationBackgroundImage}