3

我一直无法找到答案。

我有一个数据库,其中包含图像路径(“images/myimage.jpg”)。这些图像存在于我的 asp.net 网站上,该网站也是我托管 SL 的地方。我想将这些图像绑定到我的 ListBox 控件,以便显示图像。

我已经读过,因为我有一个字符串值“images/myimage.jpg”,我需要将它转换为位图图像。我已经这样做了:

xml:

 <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”不起作用?

4

5 回答 5

5

无论您的 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);

这有帮助吗?

于 2009-08-05T03:25:25.830 回答
3

Silverlight 中媒体的相对路径很古怪,因此它们可以像 WPF 路径一样(古怪)工作。相对路径是相对于 XAP 文件,而不是应用程序根目录。

一个技巧是将您的 XAP 移动到您网站的根目录,因此媒体路径将相对于根目录。

请在此处查看我在 Silverlight 中有关相对 URI 的帖子。

于 2009-08-05T01:59:47.740 回答
1

今天我自己遇到了这个问题,并按照 Jon 上面描述的方式修复了它(虽然没有看到你的帖子。本可以为我节省一些时间。)我还要指出,可以通过使用重载来解决特定错误:

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

如果不移动 XAP 文件,您仍然无法访问 images 子目录,但它可以解决错误消息。此时程序只是愉快地返回一个没有内容的图像,让您使用 Fiddler 或 Web Dev Helper 来找出真正的问题。

于 2009-08-05T03:35:31.587 回答
1

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); 
于 2010-05-13T16:08:03.460 回答
0

您可以简单地编写一个为您提供完整服务器地址(protocol://server:port/)的方法,并使用它来创建绝对 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());
于 2009-08-05T02:17:31.663 回答