كيف يمكنني مرجع الموارد المحلية في HTML الذي تم إنشاؤه في WinForms التحكم WebBrowser?

StackOverflow https://stackoverflow.com/questions/72103

سؤال

أنا باستخدام winforms التحكم webbrowser إلى عرض بعض المحتوى في نماذج windows التطبيق.أنا باستخدام DocumentText الملكية لكتابة HTML الذي تم إنشاؤه.هذا الجزء يعمل بشكل مذهل.الآن أريد أن استخدام بعض الصور في العلامات.(أنا أيضا يفضلون استخدام ربط CSS و جافا سكريبت ، ومع ذلك ، يمكن أن تعمل فقط عن طريق تضمين ذلك.)

لقد كنت أبحث على مدى عدة أيام و لا يمكن أن يبدو للعثور على إجابة على العنوان السؤال.

حاولت استخدام مرجع نسبي:التطبيق exe في bin\debug.الصور الحية في "الصور" الدليل في جذور المشروع.لقد حدد الصور المراد نسخها إلى الدليل الإخراج على تجميع, حتى أنهم في نهاية المطاف في bin\debug\الصور*.لذلك أنا ثم استخدام إشارة مثل هذه "الصور" التفكير سيكون بالنسبة إلى exe.ومع ذلك ، عندما ننظر في خصائص الصورة في متصفح جزءا لا يتجزأ من النافذة أرى URL للصورة أن تكون "حول:blankImages/*".يبدو أن كل شيء نسبي "حول:فارغة" عند كتابة HTML إلى السيطرة.تفتقر إلى موقع السياق ، لا أستطيع معرفة ما لاستخدام ملف نسبي الموارد المرجعية.

أنا مطعون حول خصائص التحكم لمعرفة ما إذا كان هناك طريقة لتعيين شيء لإصلاح هذا.أنا خلقت فارغة صفحة html ، وأشار المتصفح في ذلك باستخدام "التنقل()" طريقة استخدام كامل المحلية المسار إلى الملف.هذا يعمل بشكل جيد مع المتصفح التقارير المحلية "file:///..." الطريق إلى صفحة فارغة.ثم كتبته مرة أخرى إلى المتصفح ، هذه المرة باستخدام الوثيقة.الكتابة().مرة أخرى, المتصفح الآن التقارير "حول:فارغة" كما URL.

قصيرة من كتابة HTML ديناميكي النتائج إلى ملف حقيقي, هل هناك أي طريقة أخرى للإشارة إلى ملف الموارد ؟

وانا ذاهب الى محاولة شيء آخر:بناء المطلقة مسارات الملفات على الصور و كتابة تلك إلى HTML.بلدي HTML التي يتم توليدها باستخدام تحويل XSL من تسلسل الكائن XML لذلك سوف تحتاج للعب مع بعض XSL المعلمات والتي سوف يستغرق قليلا من الوقت الاضافي كما أنني لست على دراية بها.

هل كانت مفيدة؟

المحلول

هنا هو ما نقوم به ، على الرغم من أنني يجب أن أذكر أن نستخدم مخصص متصفح الويب على إزالة أشياء مثل القدرة على انقر بزر الماوس الأيمن فوق و رؤية جيدة IE القديمة قائمة السياق:

public class HtmlFormatter
{
    /// <summary>
    /// Indicator that this is a URI referencing the local
    /// file path.
    /// </summary>
    public static readonly string FILE_URL_PREFIX = 
        "file://";

    /// <summary>
    /// The path separator for HTML paths.
    /// </summary>
    public const string PATH_SEPARATOR = "/";
}


// We need to add the proper paths to each image source
// designation that match where they are being placed on disk.
String html = HtmlFormatter.ReplaceImagePath(
    myHtml, 
    HtmlFormatter.FILE_URL_PREFIX + ApplicationPath.FullAppPath + 
    HtmlFormatter.PATH_SEPARATOR);

في الأساس, تحتاج إلى أن يكون صورة المسار الذي يحتوي على الملف URI ، على سبيل المثال

<img src="file://ApplicationPath/images/myImage.gif">

نصائح أخرى

أدركت الأمر.

أنا فقط تمرير كاملة حل url exe الدليل إلى تحويل XSL التي تحتوي على إخراج HTML مع الصور الكلمات:

XsltArgumentList lstArgs = new XsltArgumentList();
lstArgs.AddParam("absoluteRoot", string.Empty, Path.GetFullPath("."));

ثم أنا فقط مسبوقة جميع الصور مع قيمة المعلمة:

<img src="{$absoluteRoot}/Images/SilkIcons/comment_add.gif" align="middle" border="0" />

انتهى استخدام شيء من هذا في الأساس نفس ما كين المقترحة.ومع ذلك, بدلا من يدويا إلحاق ملف البادئة, لقد استخدمت UriBuilder الدرجة لبناء كاملة URI مع "ملف" البروتوكول.

هذا أيضا حل اللاحقة المشكلة عندما تم اختبار التطبيق في أكثر واقعية موقع ملفات البرنامج.المساحات المشفرة, ولكن نظام التشغيل لا تستطيع التعامل مع ترميز الأحرف عند الملف المشار إليها باستخدام معيار مسار النظام (أي"C:\Program%20Files...").باستخدام الحقيقية URI قيمة (file:///C:/ملفات البرنامج/...) عملت.

بدلا من ذلك, الحفاظ على النمط العادي الروابط النسبية ، إسقاط HTML تحويل التعليمات البرمجية بدلا من تضمين C# خادم الويب مثل هذا في exe الخاص بك ، ثم النقطة الخاصة بك WebControl في URL الداخلية ، مثل المضيف المحلي:8199/اسم/

كين كان رمز مفقود عدد قليل من الأشياء التي تحتاج إليها للعمل.لقد المنقحة ، وأوجد طريقة جديدة التي يجب أن أتمتة الأمور قليلا.

فقط اتصل أسلوب ثابت مثل ذلك:

html = HtmlFormatter.ReplaceImagePathAuto(html);

و جميع الروابط في html التي تطابق file://ApplicationPath/ سيتم تبادلت مع دليل العمل الحالي.إذا كنت ترغب في تحديد موقع بديل ، الأصلي أسلوب ثابت مدرج (بالإضافة إلى بت كان في عداد المفقودين).

public class HtmlFormatter
{

    public static readonly string FILE_URL_PREFIX = "file://";
    public static readonly string PATH_SEPARATOR = "/";
    public static String ReplaceImagePath(String html, String path)
    {
        return html.Replace("file://ApplicationPath/", path);
    }
    /// <summary>
    /// Replaces URLs matching file://ApplicationPath/... with Executable Path
    /// </summary>
    /// <param name="html"></param>
    /// <returns></returns>
    public static String ReplaceImagePathAuto(String html)
    {
        String executableName = System.Windows.Forms.Application.ExecutablePath;
        System.IO.FileInfo executableFileInfo = new System.IO.FileInfo(executableName);
        String executableDirectoryName = executableFileInfo.DirectoryName;
        String replaceWith = HtmlFormatter.FILE_URL_PREFIX
            + executableDirectoryName
            + HtmlFormatter.PATH_SEPARATOR;

        return ReplaceImagePath(html, replaceWith);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top