การเพิ่มภาพนิ่งลงในหน้าจอเรียกดู Lightswitch HTML 2013

ในกรณีของฉัน ฉันได้ใส่โค้ดสีบางไทล์ในไคลเอนต์ HTML และฉันต้องการเพิ่มคีย์โค้ดสีแบบธรรมดา ฉันมีไฟล์ PNG ที่ฉันต้องการใช้

ฉันไม่ต้องการความสามารถในการอัปโหลดหรือเปลี่ยนภาพ

ลิงก์นี้ดูเหมือนว่าจะบรรลุสิ่งที่ฉันกำลังมองหา แต่ฉันไม่แน่ใจว่าจะต้องนำไปใช้ที่ไหน โค้ดทั้งหมดนี้เข้าไปใน PostRender ของ Image Control ที่ฉันสร้างขึ้นหรือไม่

เพิ่มรูปภาพลงใน lightswitch โดยใช้คุณสมบัติในเครื่องและตำแหน่งไฟล์

นี่คือสิ่งที่ PostRender ของรายการข้อมูล Image แบบง่ายที่ฉันสร้างเป็น Image Local Property จากนั้นลากไปยัง Solution Designer โดยพื้นฐานแล้วมันถูกคัดลอกมาจากลิงก์ด้านบน แต่ฉันเปลี่ยนชื่อไฟล์รูปภาพให้ตรงกับของฉัน และฉันได้เพิ่มรายการลงในโครงสร้างโฟลเดอร์ Content\Images แล้ว และรายการดังกล่าวจะแสดงในมุมมองไฟล์:

myapp.BrowseOrderLines.ColorKey_postRender = function (element, contentItem) {
// Write code here.
function GetImageProperty(operation) {
    var image = new Image();
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    // XMLHttpRequest used to allow external cross-domain resources to be processed using the canvas.  
    // unlike crossOrigin = "Anonymous", XMLHttpRequest works in IE10 (important for LightSwitch) 
    // still requires the appropriate server-side ACAO header (see https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image)
    var xhr = new XMLHttpRequest();
    xhr.onload = function () {
        var url = URL.createObjectURL(this.response);
        image.onload = function () {
            URL.revokeObjectURL(url);
            canvas.width = image.width;
            canvas.height = image.height;
            ctx.drawImage(image, 0, 0);
            var dataURL = canvas.toDataURL("image/png");
            operation.complete(dataURL.substring(dataURL.indexOf(",") + 1));
        };
        image.src = url;
    };
    xhr.open('GET', this.imageSource, true);
    xhr.responseType = 'blob';
    xhr.send();
};

myapp.BrowseOrderLines.ColorKey_postRender = function (element, contentItem) {
    // Write code here.
    msls.promiseOperation
    (
        $.proxy(
            GetImageProperty,
            { imageSource: "content/images/Key.png" }
        )
    ).then(
        function (result) {
            contentItem.screen.ImageProperty = result;
        }
    );
};

}

ปัจจุบัน ตัวควบคุมรูปภาพแสดงบนหน้าจอในเบราว์เซอร์ และเป็นขนาดแบบกำหนดเองที่ฉันเลือก แต่เป็นเพียงพื้นที่สีฟ้าอ่อนที่ไม่แสดงไฟล์รูปภาพของฉัน

ฉันไม่แน่ใจว่าฉันฝังภาพไว้หรือเปล่า? ฉันไม่แน่ใจว่านั่นเป็นขั้นตอนที่หายไปหรือไม่?

ขอบคุณ!!


person CreedC    schedule 12.01.2016    source แหล่งที่มา


คำตอบ (1)


วิธีที่ง่ายที่สุดในการทดสอบแนวทางนี้คือเปลี่ยน postRender ของคุณเป็นดังต่อไปนี้ (ซึ่งฝังฟังก์ชันตัวช่วยไว้ภายในฟังก์ชัน postRender):

myapp.BrowseOrderLines.ColorKey_postRender = function (element, contentItem) {
    function GetImageProperty(imageSource) {
        return msls.promiseOperation(
            function (operation) {
                var image = new Image();
                var canvas = document.createElement("canvas");
                var ctx = canvas.getContext("2d");
                // XMLHttpRequest used to allow external cross-domain resources to be processed using the canvas.  
                // unlike crossOrigin = "Anonymous", XMLHttpRequest works in IE10 (important for LightSwitch) 
                // still requires the appropriate server-side ACAO header (see https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image)
                var xhr = new XMLHttpRequest();
                xhr.onload = function () {
                    var url = URL.createObjectURL(this.response);
                    image.onload = function () {
                        URL.revokeObjectURL(url);
                        canvas.width = image.width;
                        canvas.height = image.height;
                        ctx.drawImage(image, 0, 0);
                        var dataURL = canvas.toDataURL("image/png");
                        operation.complete(dataURL.substring(dataURL.indexOf(",") + 1));
                    };
                    image.onerror = function () {
                        operation.error("Image load error");
                    };
                    image.src = url;
                };
                xhr.open('GET', imageSource, true);
                xhr.responseType = 'blob';
                xhr.send();
            }
        );
    };
    GetImageProperty("content/images/Key.png").then(function onComplete(result) {
        contentItem.screen.ImageProperty = result;
    }, function onError(error) {
        msls.showMessageBox(error);
    });
};

สิ่งนี้จะถือว่าคุณตั้งชื่อคุณสมบัติท้องถิ่น ImageProperty ตามโพสต์ต้นฉบับของฉัน และตัวควบคุมรูปภาพบนหน้าจอของคุณชื่อ ColorKey

ในตัวอย่างข้างต้น ฉันยังได้ใช้โอกาสในการลดความซับซ้อนและปรับปรุงโค้ดจากโพสต์ต้นฉบับของฉันให้ง่ายขึ้นเล็กน้อย นอกจากนี้ยังมีตัวจัดการข้อผิดพลาดแบบง่ายซึ่งอาจติดธงหากมีปัญหาในการโหลดภาพ

หากยังไม่ได้ผล คุณสามารถทดสอบกระบวนการได้โดยเปลี่ยนชื่อไฟล์ต้นฉบับของรูปภาพเป็น content/images/user-splash-screen.png (ไฟล์ PNG นี้ควรได้รับการเพิ่มตามหลักสูตรเมื่อคุณสร้างไฟล์ โครงการ LightSwitch HTML)

เนื่องจากฟังก์ชัน GetImageProperty เป็นรูทีนตัวช่วย แทนที่จะฝังมันไว้ใน postRender โดยปกติแล้วคุณจะวางไว้ภายในโมดูลตัวช่วย JavaScript ซึ่งจะทำให้สามารถนำกลับมาใช้ใหม่ได้อย่างง่ายดายโดยไม่ต้องทำซ้ำโค้ดของฟังก์ชัน หากคุณยังไม่มีไลบรารีดังกล่าวและสนใจที่จะนำไปใช้ โพสต์ต่อไปนี้จะกล่าวถึงรายละเอียดบางส่วนที่เกี่ยวข้องกับการดำเนินการนี้:

ไฟล์ JS โกลบอล Lightswitch HTML เพื่อส่งผ่านตัวแปร

person Chris Cook    schedule 12.01.2016
comment
เมื่อดูรหัสที่คุณโพสต์ ดูเหมือนว่าสิ่งเดียวที่ฉันพลาดไปคือการเรียกทรัพย์สินในพื้นที่ 'ImageProperty' คุณมีทักษะมาก ฉันขอบคุณมากที่ช่วยฉันออก ฉันอาจจะมีคำถามเพิ่มเติมและจะยังคงอยู่ในฟอรัมนี้ ฉันจะทำให้มันตรงไปตรงมาก่อนเสมอเพื่อไม่ให้กลายเป็นสัตว์รบกวน ;) นอกจากนี้ ฉันกำลังมองหาวิธียอมรับคำตอบและเครดิตของคุณเป็นคำตอบ... - person CreedC; 13.01.2016
comment
ฉันดีใจที่คำตอบนั้นมีประโยชน์ และโปรดคลิกทำเครื่องหมายเพื่อยอมรับเป็นคำตอบและโหวตว่ามีประโยชน์ ฉันเพิ่งอัปเดตโค้ดในคำตอบเพื่อปรับปรุงเล็กน้อย - person Chris Cook; 13.01.2016
comment
ในส่วนของการยอมรับคำตอบและการโหวต หากคุณยังไม่ได้ดำเนินการ ก็คุ้มค่าที่จะลองดูที่ทัวร์ชม stackoverflow เพราะสิ่งนี้จะแนะนำคุณตลอดขั้นตอน กระบวนการ. - person Chris Cook; 13.01.2016