2

WebClient通常の.Net /を使用して「ダウンロード」(読み取り:ストリームまたはバイト配列としてロード)する必要があるデータ:URIがありますWebRequest。どうやってやるの?

これが必要なのは、SVGから生成されたXAMLファイルを表示したいからです。このファイルには、データを使用したいくつかの画像が含まれています:URI。常にXAMLを解析し、イメージをディスクに保存してから、ファイルを指すようにXAMLを変更する必要はありません。WPFはWebRequestこれらの画像を取得するために内部的に使用していると思います。

4

1 に答える 1

6

あなたはそれをするために使うことができますWebRequest.RegisterPrefix()。カスタムを返すIWebRequestCreateカスタムを返すを実装する必要があります。これは、最終的にURIからデータを取得するために使用できます。次のようになります。WebRequestWebResponse

public class DataWebRequestFactory : IWebRequestCreate
{
    class DataWebRequest : WebRequest
    {
        private readonly Uri m_uri;

        public DataWebRequest(Uri uri)
        {
            m_uri = uri;
        }

        public override WebResponse GetResponse()
        {
            return new DataWebResponse(m_uri);
        }
    }

    class DataWebResponse : WebResponse
    {
        private readonly string m_contentType;
        private readonly byte[] m_data;

        public DataWebResponse(Uri uri)
        {
            string uriString = uri.AbsoluteUri;

            int commaIndex = uriString.IndexOf(',');
            var headers = uriString.Substring(0, commaIndex).Split(';');
            m_contentType = headers[0];
            string dataString = uriString.Substring(commaIndex + 1);
            m_data = Convert.FromBase64String(dataString);
        }

        public override string ContentType
        {
            get { return m_contentType; }
            set
            {
                throw new NotSupportedException();
            }
        }

        public override long ContentLength
        {
            get { return m_data.Length; }
            set
            {
                throw new NotSupportedException();
            }
        }

        public override Stream GetResponseStream()
        {
            return new MemoryStream(m_data);
        }
    }

    public WebRequest Create(Uri uri)
    {
        return new DataWebRequest(uri);
    }
}

これはbase64エンコーディングのみをサポートしますが、URIエンコーディングのサポートは簡単に追加できます。

次に、次のように登録します。

WebRequest.RegisterPrefix("data", new DataWebRequestFactory());

そして、はい、これはデータを取得するために機能します:XAMLファイル内の画像。

于 2013-02-08T18:59:34.777 に答える