2010-12-21 7 views
1

これをできるだけシンプルにするために、新しいデフォルトのSilverlight 4アプリケーションを作成し、アプリケーションが生成されたときに自動的に作成されるImagesフォルダをテストWebサイトに追加しました。私は同じ画像を置いて、それをClientBinフォルダとImagesフォルダの "imageName.png"と呼んでみましょう。今、私はちょうどこのようにXAMLを使用してClientBinに画像を使用する場合、すべてが正常に動作します:Silverlightページに外部画像が読み込まれないのはなぜですか?

<Grid x:Name="LayoutRoot" Background="White"> 
    <StackPanel> 
     <Image Source="imageName.png" Width="16" Height="16"/> 
     <TextBox Text="Hello" /> 
    </StackPanel> 
</Grid> 

しかし、私は画像で画像にアクセスしようとすると、画像がロードされない。このようにフォルダ:

<Grid x:Name="LayoutRoot" Background="White"> 
    <StackPanel> 
     <Image Source="../Images/imageName.png" Width="16" Height="16"/> 
     <TextBox Text="Hello" /> 
    </StackPanel> 
</Grid> 

エラーはありませんが、画像はありません。誰が私に何が起こっているか教えてもらえますか?私が見つけたことは、これがうまくいくはずであることを示唆しているようです。

答えて

2

ここで問題となるのは、Xap自体のトップコンテンツとXapを含むフォルダがパスのルートにあるとみなされることです。したがってパス "/"は、XapのトップコンテンツとXapが置かれているフォルダ(通常はClientBin)にマップされます。ルートと見なされる親パスを使用しようとすると、Silverlightネットワークエラーが発生します。

Xapが見つかったフォルダ以外のコンテンツには、絶対Uriを使用してのみアクセスできます。

次に、親パスを含む相対アドレスを絶対アドレスに変換してから、Image.Sourceプロパティに渡します。好ましくは、ソース絶対コードをソースコードにハードコーディングすることを避けたいです。

WebClientオブジェクトのBaseAddressプロパティを使用して、現在のXapの絶対URLを取得できます。これから、親パスを含む相対アドレスであっても相対アドレスと組み合わせて、望ましい絶対アドレスを構成することができます。

値コンバータは、XAMLでこれを簡単にすることができます: -

public class WebRelativeConverter : IValueConverter 
{ 
    public Uri Base { get; set; } 

    public WebRelativeConverter() 
    { 
     Base = new Uri((new WebClient()).BaseAddress, UriKind.Absolute); 
    } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Uri result = null; 

     if (value is Uri) 
     { 
      result = new Uri(Base, (Uri)value); 
     } 
     else if (value != null) 
     { 
      result = new Uri(Base, value.ToString()); 
     } 
     return result; 
    } 

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

今XAMLで固定された値は次のようになります - あなたが実際にソースを結合している場合

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.Resources> 
     <local:WebRelativeConverter x:Key="wrc" /> 
    </Grid.Resources> 
    <StackPanel> 
     <Image DataContext="../Images/imageName.png" Source="{Binding Converter={StaticResource wrc}}" Width="16" Height="16"/> 
     <TextBox Text="Hello" /> 
    </StackPanel> 
</Grid> 

いくつかのオブジェクトのUriまたはStringプロパティは、コンバータを追加するだけで動作するはずです。

関連する問題