none
Xamlでコンテンツ設定した画像をロードできない。 RRS feed

  • 質問

  • 以下のようなプロジェクトの構成でプロジェクトを作成しています。
    bin以下はデザイナー、プログラマーにアクセス権が設定されておりsrc以下はプログラマーしかアクセスできない為
    以下のような構成になっているのですが

    ├bin
    │├cs.exe
    │├cpp.exe
    │└data
    │ └picdata
    ├src
    │├cs
    ││└cs.sln
    ││ └cs.csproj
    │└cpp
    │ └cpp.sln

    BlendやVSにて<Image Source="../../../../bin/data/picdata/picture.png" />と指定すればツール上では表示されるのですが
    実行時何も描画されず困っております。
    プロジェクトプロパティにて出力パスをbin直下に設定するもデバッガ実行するとXamlParseExceptionが発生しました。
    となり実行できません。

    画像のビルドオプションはリソースにした場合exeファイルが1GB程度のサイズになってしまったので
    コンテンツとして画像をリンクで呼び出したいと思っております。

    このようなプロジェクト構成の場合どのようにVSの設定及びBlend上の設定をすればよいのか検討もつかず困っております。
    • 編集済み しえる 2013年11月22日 8:29
    2013年11月22日 8:28

回答

  • 実行時に動的に参照するのも可能だけどファイルがたくさんあると面倒。
    ジャンクションで相対位置にディレクトリがあるように見せるのが簡単。
    シンボリックリンク・ハードリンクなどでも可能なので、OSや管理者権限を考慮して選ぶといいです。
    参考:@IT
    ジャンクション機能を使ってフォルダをマウントする
    シンボリック・リンクとジャンクションとハードリンクの違い

    binフォルダがD:\Test\binにあるとするとコマンドラインで以下のようにして作成できます。
    mklink /J "D:\Test\src\cs\cs\data" "D:\Test\bin\data"
    フォルダ構造は以下のようになりプロジェクトVSからも実行中も/dataフォルダ以下にある画像ファイルを同じ相対パスとすることができます。

    D:\Test\
    ├bin\ ・・・-ビルド出力先フォルダ
    │├cs.exe
    │├cpp.exe
    │└data\  ・・・ジャンクション先(ターゲット)
    │ └picdata\
    │  └picture.png  ・・・実体が配置されている画像ファイル
    ├src\
    │├cs\ ・・・ソリューションフォルダ
    ││├cs.sln ・・・ソリューションファイル
    ││└cs\ ・・・プロジェクトフォルダ
    ││ ├cscsproj ・・・プロジェクトファイル
    ││ └data\ ・・・※bin\dataへのジャンクション(リンク)
    ││  └picdata\
    ││   └picture.png ・・・ジャンクションでプロジェクトから相対的にあるように見える画像ファイル
    │└cpp
    │ └cpp.sln

    こうすると相対パスが簡略化されて

    <Image Source="/data/picdata/picture.png" />
    となります。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2013年11月25日 0:39
    • 回答としてマーク しえる 2013年11月26日 2:44
    2013年11月23日 4:06

すべての返信

  • 実行時に動的に参照するのも可能だけどファイルがたくさんあると面倒。
    ジャンクションで相対位置にディレクトリがあるように見せるのが簡単。
    シンボリックリンク・ハードリンクなどでも可能なので、OSや管理者権限を考慮して選ぶといいです。
    参考:@IT
    ジャンクション機能を使ってフォルダをマウントする
    シンボリック・リンクとジャンクションとハードリンクの違い

    binフォルダがD:\Test\binにあるとするとコマンドラインで以下のようにして作成できます。
    mklink /J "D:\Test\src\cs\cs\data" "D:\Test\bin\data"
    フォルダ構造は以下のようになりプロジェクトVSからも実行中も/dataフォルダ以下にある画像ファイルを同じ相対パスとすることができます。

    D:\Test\
    ├bin\ ・・・-ビルド出力先フォルダ
    │├cs.exe
    │├cpp.exe
    │└data\  ・・・ジャンクション先(ターゲット)
    │ └picdata\
    │  └picture.png  ・・・実体が配置されている画像ファイル
    ├src\
    │├cs\ ・・・ソリューションフォルダ
    ││├cs.sln ・・・ソリューションファイル
    ││└cs\ ・・・プロジェクトフォルダ
    ││ ├cscsproj ・・・プロジェクトファイル
    ││ └data\ ・・・※bin\dataへのジャンクション(リンク)
    ││  └picdata\
    ││   └picture.png ・・・ジャンクションでプロジェクトから相対的にあるように見える画像ファイル
    │└cpp
    │ └cpp.sln

    こうすると相対パスが簡略化されて

    <Image Source="/data/picdata/picture.png" />
    となります。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2013年11月25日 0:39
    • 回答としてマーク しえる 2013年11月26日 2:44
    2013年11月23日 4:06
  • ありがとうございます。

    ジャンクションリンクで正常に動作することが出来ました。

    ただ、SVNや他の環境で再設定が必要になるので環境依存しない方法を検討したいので他に方法があればご教授いただければ幸いです。

    以上よろしくお願いします。

    2013年11月28日 8:16