Как мне отформатировать URI при привязке изображения в Silverlight? - PullRequest
3 голосов
/ 05 августа 2009

Я не смог найти ответ на этот вопрос.

У меня есть база данных, в которой есть пути к изображениям ("images / myimage.jpg"). Эти изображения существуют на моем сайте asp.net, где я также размещаю SL. Я хочу привязать эти изображения к своему элементу управления ListBox, чтобы оно отображалось.

Я прочитал, что, поскольку у меня есть строковое значение images / myimage.jpg, мне нужно преобразовать его в изображение BitMap. Я сделал это:

XAML:

 <Image Source="{Binding ImageFile, Converter={StaticResource ImageConverter}}"/>

Класс ImageConverter:

    public object Convert(object value, Type targetType,
                                  object parameter, CultureInfo culture)
            {
                try
                {
                    Uri source= new Uri(value.ToString());
                    return new BitmapImage(source);
                }
                catch(Exception ex)
                {
                    return new BitmapImage();
                }
            }

При создании URI выдается сообщение об ошибке «Не удалось определить формат URI». Что я делаю неправильно? Если я создаю Uri, который выглядит следующим образом: http://localhost:49723/images/myimage.jpg,, он работает просто отлично.

Почему не работает "images / myimage.jpg"?

Ответы [ 5 ]

5 голосов
/ 05 августа 2009

Простой динамический подход, который будет работать независимо от того, где находится ваш файл XAP, похож на следующий.

//Get the root path for the XAP
string src = Application.Current.Host.Source.ToString();

//Get the application root, where 'ClientBin' is the known dir where the XAP is
string appRoot = src.Substring(0,src.IndexOf("ClientBin")); 

//Create the image / uri
BitmapImage img = new BitmapImage();
img.UriSource = new Uri(appRoot + "/Images/myImage.png", UriKind.Relative);

Помогает ли это?

3 голосов
/ 05 августа 2009

Относительные пути к носителям в Silverlight странные, поэтому они могут работать так же (странно), как пути WPF. Относительные пути относятся к файлу XAP, а не к корню приложения.

Один трюк состоит в том, чтобы переместить XAP в корень вашего веб-сайта , чтобы пути мультимедиа были относительно корня.

Смотрите мой пост об относительных URI в Silverlight здесь .

1 голос
/ 13 мая 2010

http://www.silverlightexamples.net/post/How-to-Get-Files-From-Resources-in-Silverlight-20.aspx

Ресурс и Никогда не копируйте изображение, затем используйте «SLapplicationName; component / mypathtoimage / image.png»

using System.Windows.Resources;      // StreamResourceInfo
using System.Windows.Media.Imaging;  // BitmapImage
....

StreamResourceInfo sr = Application.GetResourceStream(
    new Uri("SilverlightApplication1;component/MyImage.png", UriKind.Relative));
BitmapImage bmp = new BitmapImage();
bmp.SetSource(sr.Stream); 
1 голос
/ 05 августа 2009

Сегодня я сам столкнулся с этой проблемой и исправил ее так, как Джон описал выше (хотя, не видя вашего поста. Мог бы сэкономить мне некоторое время.) Я бы также указал, что конкретная ошибка может быть устранена с помощью перегрузки :

Uri source = new Uri("Path/Image.jpg", UriKind.Relative);

Вы по-прежнему не сможете получить доступ к подкаталогу images без перемещения файла XAP, но это устраняет сообщение об ошибке. В этот момент программа просто с радостью возвращает изображение без содержимого, предоставляя вам возможность использовать Fiddler или Web Dev Helper для выяснения реальной проблемы.

0 голосов
/ 05 августа 2009

Вы можете просто написать метод, который дает вам полный адрес сервера (протокол: // сервер: порт /) и использовать его для создания абсолютных URL:

public class Helper{
    public static string ServerAddress{
        get{
            if (_server == "")
                _server = _ServerAddress();
            return _server;
        }
    }

     private static string _ServerAddress(){
        HttpContext ctx = HttpContext.Current;
        if (ctx == null) return "";

        HttpRequest request = ctx.Request;
        if (request == null) return "";

      string srvr = request.ServerVariables["SERVER_NAME"];
      string port = string.IsNullOrEmpty(request.ServerVariables["SERVER_PORT"])?
            "" : ":" + request.ServerVariables["SERVER_PORT"];
      string protocol = "http://";//request.ServerVariables["SERVER_PROTOCOL"];
      return string.Format("{0}{1}{2}{3}", protocol, srvr, port, 
                   request.ApplicationPath);
    }
}    

и измените вам строку метода конвертера:

Uri source= new Uri(value.ToString());

до

if(!string.IsNullOrEmpty(value.ToString()))
   Uri source= new Uri(Helper.WebAddress + value.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...