Как ссылаться на базовые URL-адреса для изображений в XAML в Silverlight? - PullRequest
3 голосов
/ 11 ноября 2009

У меня есть изображения, разбросанные по всему моему приложению silverlight, и из-за структуры, которую мы определили, все изображения извлекаются из URL-адреса HTTP.

В настоящее время в XAML изображение будет объявлено следующим образом:

<Image Source="http://www.example.com/directory/example.png" />

Мне бы хотелось, чтобы базовый URL-адрес для всех изображений, на которые есть ссылки, сохранялся в глобальной строковой константе, доступной из всех файлов XAML и кода за файлами.

т.е. константная строка BASE_URI = "http://www.example.com/directory";

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

1 Ответ

2 голосов
/ 11 ноября 2009

Нет способа достичь желаемого без какого-либо значительного кода. Самое простое решение, как вы уже подумали, - использовать конвертер. Это правда, что для этого требуется привязка данных, поэтому оно не так чисто, как статическое значение свойства источника. Однако, поскольку статическое значение свойства source уже является проблемой, вряд ли стоит избегать такого подхода. Вот мое предпочтительное решение: -

Преобразователь: -

public class BaseUriConverter : IValueConverter
{
    private Uri myBaseUri;

    public BaseUriConverter()
    {
        myBaseUri = new Uri(Application.Current.Host.Source.AbsoluteUri); 
    }
    public string AdjustPath { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Uri uri = new Uri(myBaseUri, AdjustPath);
        Uri result = new Uri(uri, (string)parameter);
        return result.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException("This converter only works for one way binding");
    }
}

На ресурсе в App.Xaml: -

<local:BaseUriConverter x:Key="BaseUri" AdjustPath=".." />

Обратите внимание, что использование ".." допускает типичное использование. Где Xap находится в папке Clientbin папки приложения. Следовательно, изображения могут храниться в общей папке относительно папки приложения, и это работает независимо от того, запущен ли сайт в Visual Studio или установлен как корневой сайт в IIS.

Тогда изображение на странице где-то может выглядеть так: -

<Image DataContext="0" Source="{Binding Converter={StaticResource BaseUri}, ConverterParameter='images/Test.jpg' }"  />

Обратите внимание, что свойство DataContext установлено, следовательно, происходит привязка, конвертер не беспокоится о значении. Также в этом случае путь является относительным.

В вашем конкретном примере вы можете назначить в коде свой фиксированный baseURL свойству AdjustPath преобразователя, однако я подозреваю, что в нынешнем виде это будет соответствовать вашим потребностям.

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