none
Generic.xamlの中のImageのSourceを、相対パス指定する方法について

    質問

  • こんにちは。損と申します。

    カスタムコントロールを作成して、Generic.xamlのStyleに
    画像表示を記述しようとしております。

    ImageタグのSourceを絶対パス指定すれば画像を表示できるのですが、
    下記のようにファイル名だけで指定すると、下の例外が発生してしまいます。

    Sourceを相対パスで指定するためには、どのように指定してやればよいでしょうか。
    もしくは、どこにファイルを置けばよいでしょうか。
    (ソリューションフォルダ直下や、Generic.xamlと同じフォルダでは例外が発生しました。)


    <Style TargetType="{x:Type local:XXXControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:XXXControl}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <DockPanel>
                            <Grid>
                                <Image x:Name="sample" Source="sample.png"/>
                            </Grid>
                        </DockPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


    System.Reflection.TargetInvocationException:
    呼び出しのターゲットが例外をスローしました。
    ---> System.Windows.Markup.XamlParseException:
    属性 'Source' の文字列 'sample.png' を型 'System.Windows.Media.ImageSource' の
    オブジェクトに変換することはできません。
    リソース 'sample.png' を検索できません。 
    オブジェクト 'System.Windows.Controls.ControlTemplate'
    にエラーがあります。行 48 位置 124。 --->
    System.IO.IOException: リソース 'sample.png' を検索できません。


    根本的に間違えている可能性もありますが、御助言いただけますと幸いです。

    2010年1月6日 1:44

回答

  • pack スキームを使って指定すればどうでしょう?
    Windows Presentation Foundation におけるパッケージの URI
    ここの「コンテンツファイルのパッケージの URI」がアセンブリを基準にしたフォルダのローカルファイルを表します。
    // ただし、.. によって親フォルダに遡ることはできないと思います。多分。
    • 回答としてマーク 2010年1月13日 10:00
    2010年1月6日 2:01
  • と書いてから pack をちょっといじったけど正直よく分からない動き。

    プロジェクトに sample.png を追加し、「ビルドアクション」を「コンテンツ」に、「出力ディレクトリにコピー」を「新しい場合はコピーする」に設定しておけば、普通の相対パスでデザイン時・実行時共に正しく認識されるようですよ。
    • 回答としてマーク 2010年1月13日 10:00
    2010年1月6日 2:33

すべての返信

  • pack スキームを使って指定すればどうでしょう?
    Windows Presentation Foundation におけるパッケージの URI
    ここの「コンテンツファイルのパッケージの URI」がアセンブリを基準にしたフォルダのローカルファイルを表します。
    // ただし、.. によって親フォルダに遡ることはできないと思います。多分。
    • 回答としてマーク 2010年1月13日 10:00
    2010年1月6日 2:01
  • と書いてから pack をちょっといじったけど正直よく分からない動き。

    プロジェクトに sample.png を追加し、「ビルドアクション」を「コンテンツ」に、「出力ディレクトリにコピー」を「新しい場合はコピーする」に設定しておけば、普通の相対パスでデザイン時・実行時共に正しく認識されるようですよ。
    • 回答としてマーク 2010年1月13日 10:00
    2010年1月6日 2:33
  • 御助言、ありがとうございます。
    ご指示頂いた内容で相対パス指定することができました。
    packについても調べてみたいと思います。

    2010年1月6日 8:02