Проблема здесь в том, что папка, содержащая Xap и верхний контент в самом Xap, считается корнем пути. Следовательно, путь "/" соответствует верхнему содержимому в Xap и папке, в которой находится Xap (обычно ClientBin). Любая попытка использовать родительский путь после того, что считается корневым, приведет к сетевой ошибке Silverlight.
Любой контент вне папки, в которой находится Xap, доступен только с использованием абсолютного Uri.
Затем необходимо преобразовать относительный адрес, содержащий родительский путь, в абсолютный адрес, прежде чем передать его свойству Image.Source
. Предпочтительно, мы хотели бы избежать жесткого кодирования базового абсолютного адреса в исходный код.
Мы можем получить текущий захват абсолютного URL для Xap, используя свойство BaseAddress
объекта WebClient
. Исходя из этого, мы можем составить желаемый абсолютный адрес, объединив его с относительным адресом, даже если он содержит родительский путь.
Преобразователь значений может упростить это в 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 какого-либо объекта, вам нужно только добавить конвертер, и он должен работать.