2009-09-18 15 views
12

私のWpfアプリケーションでイメージのソースを設定する際に問題があります。私はこのように、ソースはDataContextのオブジェクトのSourceUriプロパティにバインドされたイメージを持っている:今Wpf - 相対イメージソースパス

<Image Source="{Binding SourceUri}"></Image> 

、私は私のオブジェクトのSourceUriプロパティに設定するのか分かりません。完全な絶対パス( "c:/etc/image.jpg")を設定するとうまく表示されますが、明らかに相対パスを設定したいと思います。私の画像は、私のアプリケーションフォルダと同じフォルダにあるResourcesというフォルダに保存されています。結局のところ、これらの画像はどこから来てもかまわないので、プロジェクトに実際に追加することは選択肢にはなりません。

私は、アプリケーションフォルダからの相対パスと作業パス(デバッグフォルダ)からの相対パスを試しました。また、 "pack:// .."構文を使用してみましたが、これは何のポイントでもないことをお読みください。

私は何を試してほしいのですか?

答えて

9

DataContextオブジェクトのSourceUriプロパティを少し鮮明にして、アプリケーションフォルダが何であるかを判断し、それに基づいて絶対パスを返す可能性があります。たとえば:

public string SourceUri 
{ 
    get 
    { 
     return Path.Combine(GetApplicationFolder(), "Resources/image.jpg"); 
    } 
} 
+0

確かに - 作品 - Thxを!しかし、アプリケーションフォルダを見つけるための良い方法を見つけることができませんでしたので、ちょっと現時点ではハッピーに感じる..NetにGetApplicationFolder()はありますか? 1つを見つけることができませんでした。しかし、相対パス参照は何とか働くべきではありませんか?そして、これらはアプリケーションのルートフォルダに相対的なものになりますか?いいえ? – stiank81

+1

Path.GetDirectoryName(Assembly.GetExecutingAssembly()を試してください。ロケーション); –

+0

これは、私が使用しているものと同じですが、 "Path.GetFullPath("。 ")ですが、私は後者が作業フォルダに依存していると思うので、あなたの提案に従ってください。私はそれを理解するでしょう。Thxあなたの注意のため! – stiank81

3

Environment.CurrentDirectoryは( - しかし、我々はそれがどこにあるか、あなたが既に知っていると仮定することができますそれはあなたが手動で.CurrentDirectoryを設定しない限りです)あなたに.exeファイルが保存されているフォルダが表示されます。

17

これを支援することができSystem.IO.Pathで便利な方法があります:または任意のフル・パスは次のとおりです。

return Path.GetFullPath("Resources/image.jpg"); 

これは「\フォルダ\ MoreFolders \リソース\のimage.jpg C」を返す必要がありますあなたの文脈で現在の作業フォルダを開始点として使用します。私は、これは私自身の変換を実装解決

<Image Source="pack://application:,,,/{Binding ChannelInfo/ChannelImage}"> 

<Image Source="pack://siteoforigin:,,,/{Binding ChannelInfo/ChannelImage}"> 

<Image Source="/{Binding ChannelInfo/ChannelImage}"> 

にしようといくつかのイライラ回後

Link to MSDN documentation on GetFullPath.

+2

これは素晴らしいです - 私は自分自身のフルパスを供給したい場合は、それはまだ動作します。 – paddy

7

ER:

C#の方:

public class MyImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string path= (string)value; 

     try 
     { 
      //ABSOLUTE 
      if (path.Length > 0 && path[0] == System.IO.Path.DirectorySeparatorChar 
       || path.Length > 1 && path[1] == System.IO.Path.VolumeSeparatorChar) 
       return new BitmapImage(new Uri(path)); 

      //RELATIVE 
      return new BitmapImage(new Uri(System.IO.Directory.GetCurrentDirectory() + System.IO.Path.DirectorySeparatorChar + path)); 
     } 
     catch (Exception) 
     { 
      return new BitmapImage(); 
     } 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

XAML側:

<UserControl.Resources> 
    <local:ImageConverter x:Key="MyImageConverter" /> 
    (...) 
</UserControl.Resources> 

<Image Source="{Binding Products/Image, Converter={StaticResource MyImageConverter}}"> 

乾杯、

セルジオ