2010-12-21 2 views
1

가능한 한 간단하게 만들기 위해 새 기본 Silverlight 4 응용 프로그램을 만들고 응용 프로그램이 생성 될 때 자동으로 만들어지는 Images 폴더를 테스트 웹 사이트에 추가했습니다. 같은 이미지를 넣고, ClientBin 폴더와 Images 폴더에 "imageName.png"라고 부르 자.Silverlight 페이지에서 내 외부 이미지가로드되지 않는 이유는 무엇입니까?

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

을하지만이 같은 폴더 이미지에서 이미지를 액세스하려고 할 때 이미지가로드되지 않습니다 : 난 그냥 같이 XAML을 사용하여 ClientBin의 이미지를 사용하면 이제 모든 것이 잘 작동

<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 속성을 사용하면 변환기 만 추가하면됩니다.

관련 문제