Почему мое внешнее изображение не загружается на мою страницу Silverlight? - PullRequest
1 голос
/ 21 декабря 2010

Чтобы сделать это максимально простым, я создал новое приложение Silverlight 4 по умолчанию и добавил папку «Изображения» на тестовый веб-сайт, который автоматически создается при создании приложения. Я поместил одно и то же изображение, назовем его «imageName.png» в папке ClientBin и папке Images. Теперь все работает нормально, когда я просто использую изображение в ClientBin с использованием XAML, например:

<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>

Я не получаю никаких ошибок, но изображения просто нет. Кто-нибудь может сказать мне, что происходит? Все, что я смог найти, говорит о том, что это должно сработать.

1 Ответ

2 голосов
/ 21 декабря 2010

Проблема здесь в том, что папка, содержащая 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 какого-либо объекта, вам нужно только добавить конвертер, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...