Blazor js和c#互操作

c# 操作js

定义js变量 

<img id="blazor_logo" />

await js.InvokeVoidAsync("eval", "myimage = document.getElementById('blazor_logo')");

方式1、

ProcessDrawRect.js

class Region {
    constructor(index, startX, startY, width, height, name, isSelected = false) {
        this.index = index;
        this.startX = startX;
        this.startY = startY;
        this.width = width;
        this.height = height;
        this.name = name;
        this.isSelected = isSelected;
    }
}

let CanvaseId = null; //Canvas id
let regions = []; // 存储所有矩形的数组  
let isDrawing = false; // 是否正在绘制新矩形的标志  
let currentRect = null; // 当前正在绘制的矩形
let selectedRect = null; // 当前选中的矩形
var dotnetHelper;
let isCanDraw = false;//是否可以画

export function initCanvasRect(DotnetHelper, canvaseId, IsCanDraw) {
    CanvaseId = canvaseId;
    var canvas = document.getElementById(canvaseId);
    isCanDraw = IsCanDraw;
    dotnetHelper = DotnetHelper;
    canvas.addEventListener('mousedown', canvasmousedown);

    canvas.addEventListener('mousemove', function (e) {
        if (!isCanDraw)
            return;
        if (regions.length > 1)
            return;
        if (!isDrawing) return;

        dotnetHelper.invokeMethodAsync('ProcessMouseMove', e.offsetX, e.offsetY);

        const width = e.offsetX - currentRect.startX;
        const height = e.offsetY - currentRect.startY;
        currentRect.width = width;
        currentRect.height = height;
        drawRegion(); // 更新并绘制当前矩形 
    });

    canvas.addEventListener('mouseup', canvasemouseup);

}
function GetIndex() {
    if (regions.length == 0)
        return 1;
    if (regions.length == 1) {
        var index = regions[0].index;
        if (index == 1)
            return 2;
        return 1;
    }
    return 0;
}

function canvasmousedown(e) {
    if (!isCanDraw)
        return;

    dotnetHelper.invokeMethodAsync('ProcessMouseDown', e.offsetX, e.offsetY);
    isDrawing = true;
    var canvas = document.getElementById(CanvaseId);
    const rect = canvas.getBoundingClientRect();
    const x = e.offsetX; //e.clientX - rect.left;
    const y = e.offsetY; //e.clientY - rect.top;

    regions.forEach(function (item, index) {
        item.isSelected = false;
    });
    selectedRect = null;
    for (let i = regions.length - 1; i >= 0; i--) {
        if (isPointInRect(regions[i], x, y)) {
            regions[i].isSelected = true;
            selectedRect = regions[i];
            break;
        }
    }
    var index = GetIndex();
    currentRect = new Region(index, x, y, 0, 0, "", true);
    drawRegion(); // 绘制初始矩形(只是一个点) 
}

function canvasemouseup(e) {
    isDrawing = false;

    let isRect = false;
    if (currentRect && currentRect.width !== 0 && currentRect.height !== 0) {
        var isExist = regions.filter(function (item) {
            return item.startX === currentRect.startX && item.startY === currentRect.startY && item.width === currentRect.width && item.height === currentRect.height;
        });
        if (isExist.length === 0) {
            regions.push({ ...currentRect }); // 存储完成的矩形  
        }
        isRect = true;
    }

    if (isRect)
        dotnetHelper.invokeMethodAsync('ProcessMouseSelect', currentRect, true);
    else {
        if (selectedRect)
            dotnetHelper.invokeMethodAsync('ProcessMouseSelect', selectedRect, false);
        else
            dotnetHelper.invokeMethodAsync('ProcessMouseSelect', null, false);
    }

    currentRect = null; // 重置当前矩形 
}

//清空canvas
export function clearCanvasRect(canvaseId) {
    isCanDraw = false;
    var canvas = document.getElementById(canvaseId);
    var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    regions = [];

    canvas.removeEventListener('mouseup', canvasemouseup);
    canvas.addEventListener('mouseup', canvasemouseup);
}

// 添加一个函数来检测点击的坐标是否在某个矩形内  
function isPointInRect(rect, x, y) {
    var endX = rect.startX + (rect.width);
    var endY = rect.startY + (rect.height);

    let rx = Math.min(rect.startX, endX);
    let ry = Math.min(rect.startY, endY);
    let width = rect.width;
    let height = rect.height;
    return x >= rx && x <= rx + width &&
        y >= ry && y <= ry + height;
}

function drawRegion() {
    var canvas = document.getElementById(CanvaseId);
    var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除画布上的内容


    if (currentRect && currentRect.width !== 0 && currentRect.height !== 0) {
        drawRect(currentRect); // 绘制当前矩形  
        regions.forEach(function (item, index) {
            item.isSelected = false;
        });
    }

    // 绘制所有矩形  
    regions.forEach(rect => {
        ctx.beginPath();
        ctx.rect(rect.startX, rect.startY, rect.width, rect.height);
        ctx.lineWidth = 2; // 正常矩形的线宽
        ctx.strokeStyle = rect.isSelected ? 'red' : 'green'
        ctx.stroke();

        //显示文字
        if (rect.index) {
            ctx.font = "16px Arial";
            ctx.fillStyle = "black";
            ctx.textAlign = 'center';
            ctx.textBaseline = 'middle';
            var name = "Region " + rect.index.toString();
            ctx.fillText(name, rect.startX + rect.width / 2, rect.startY + rect.height / 2);
        }
    });
}

function drawRect(rect) {
    var canvas = document.getElementById(CanvaseId);
    var ctx = canvas.getContext('2d');
    ctx.beginPath();
    ctx.lineWidth = 2; // 例如,使用更宽的线宽  
    ctx.strokeStyle = 'red'; // 使用红色边框
    ctx.rect(rect.startX, rect.startY, rect.width, rect.height);
    ctx.stroke();

    //显示文字
    if (rect.index) {
        ctx.font = "16px Arial";
        ctx.fillStyle = "black";
        ctx.textAlign = 'center';
        ctx.textBaseline = 'middle';
        var name = "Region " + rect.index.toString();
        ctx.fillText(name, rect.startX + rect.width / 2, rect.startY + rect.height / 2);
    }
}

//删除矩形
export function deleteDraw(index) {
    regions = regions.filter(function (item) {
        return item.index !== index;
    });
    drawRegion(); // 重新绘制
}

//获取所有图形
function GetAllRectangle() {
    return regions;
}

//渲染矩形
export function RenderRectangle(rects) {
    regions = [];
    for (let i = rects.length - 1; i >= 0; i--) {
        var rect = rects[i];
        var isSelect = false;
        var insert = new Region(rect.index, rect.startX, rect.startY, rect.width, rect.height, rect.name, isSelect);
        regions.push({ ...insert }); // 存储完成的矩形  
    }
    drawRegion();
    dotnetHelper.invokeMethodAsync('ProcessMouseSelect', null, false);
}
    public IJSObjectReference? module;

    protected override async Task OnInitializedAsync()
    {
        module = await jsRuntime.InvokeAsync<IJSObjectReference>("import", "./ProcessDrawRect.js");
        await module.InvokeVoidAsync("clearCanvasRect", "id名称");//调用js clearCanvasRect 方法
    }

方法2、

          private readonly IJSRuntime _jSRuntime;
  
            //修改元素宽高
            await _jSRuntime.InvokeVoidAsync("eval", @"
                function resizeImage(elementId, width, height) {
                    var img = document.getElementById(elementId);
                    if (img) {
                        img.style.width = width + 'px';
                        img.style.height = height + 'px';
                    }
                }
            ");//定义js 方法resizeImage


            await _jSRuntime.InvokeVoidAsync("resizeImage", idName, Width, Height);//调用方法resizeImage

方法3、

drawRect.js

class Region {
    constructor(index, startX, startY, width, height, name, isSelected = false) {
        this.index = index;
        this.startX = startX;
        this.startY = startY;
        this.width = width;
        this.height = height;
        this.name = name;
        this.isSelected = isSelected;
    }
}

let CanvaseId = null; //Canvas id
let regions = []; // 存储所有矩形的数组  
let isDrawing = false; // 是否正在绘制新矩形的标志  
let currentRect = null; // 当前正在绘制的矩形
let selectedRect = null; // 当前选中的矩形
var dotnetHelper;
let isCanDraw = false;//是否可以画

function initCanvas(DotnetHelper, canvaseId, IsCanDraw) {
    CanvaseId = canvaseId;
    var canvas = document.getElementById(canvaseId);
    isCanDraw = IsCanDraw;
    this.dotnetHelper = DotnetHelper;
    canvas.addEventListener('mousedown', canvasmousedown);

    canvas.addEventListener('mousemove', function (e) {
        if (!isCanDraw)
            return;
        if (regions.length > 1)
            return;
        if (!isDrawing) return;

        dotnetHelper.invokeMethodAsync('MouseMove', e.offsetX, e.offsetY);

        const width = e.offsetX - currentRect.startX;
        const height = e.offsetY - currentRect.startY;
        currentRect.width = parseFloat(width);
        currentRect.height = parseFloat(height);
        drawRegion(); // 更新并绘制当前矩形 
    });

    canvas.addEventListener('mouseup', canvasemouseup);

}
function GetIndex() {
    if (regions.length == 0)
        return 1;
    if (regions.length == 1) {
        var index = regions[0].index;
        if (index == 1)
            return 2;
        return 1;
    }
    return 0;
}

function canvasmousedown(e) {
    if (!isCanDraw)
        return;

    dotnetHelper.invokeMethodAsync('MouseDown', e.offsetX, e.offsetY);
    isDrawing = true;
    var canvas = document.getElementById(CanvaseId);
    const rect = canvas.getBoundingClientRect();
    const x = e.offsetX; //e.clientX - rect.left;
    const y = e.offsetY; //e.clientY - rect.top;

    regions.forEach(function (item, index) {
        item.isSelected = false;
    });
    selectedRect = null;
    for (let i = regions.length - 1; i >= 0; i--) {
        if (isPointInRect(regions[i], x, y)) {
            regions[i].isSelected = true;
            selectedRect = regions[i];
            break;
        }
    }
    var index = GetIndex();
    currentRect = new Region(index, parseFloat(x), parseFloat(y), 0, 0, "", true);
    drawRegion(); // 绘制初始矩形(只是一个点) 
}

function canvasemouseup(e) {
    isDrawing = false;

    let isRect = false;
    if (currentRect && currentRect.width !== 0 && currentRect.height !== 0) {
        var isExist = regions.filter(function (item) {
            return item.startX === currentRect.startX && item.startY === currentRect.startY && item.width === currentRect.width && item.height === currentRect.height;
        });
        if (isExist.length === 0) {
            regions.push({ ...currentRect }); // 存储完成的矩形  
        }
        isRect = true;
    }

    if (selectedRect) {
        dotnetHelper.invokeMethodAsync('MouseSelect', selectedRect);
    }
    else {
        if (isRect)
            dotnetHelper.invokeMethodAsync('MouseSelect', currentRect);
        else
            dotnetHelper.invokeMethodAsync('MouseSelect', null);
    }
    currentRect = null; // 重置当前矩形 
}

//清空canvas
function clearCanvasRect() {
    isCanDraw = false;
    var canvas = document.getElementById(CanvaseId);
    var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    regions = [];

    canvas.removeEventListener('mouseup', canvasemouseup);
    canvas.addEventListener('mouseup', canvasemouseup);
}

// 添加一个函数来检测点击的坐标是否在某个矩形内  
function isPointInRect(rect, x, y) {
    var endX = rect.startX + (rect.width);
    var endY = rect.startY + (rect.height);

    let rx = Math.min(rect.startX, endX);
    let ry = Math.min(rect.startY, endY);
    let width = rect.width;
    let height = rect.height;
    return x >= rx && x <= rx + width &&
        y >= ry && y <= ry + height;
}

function drawRegion() {
    var canvas = document.getElementById(CanvaseId);
    var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除画布上的内容


    if (currentRect && currentRect.width !== 0 && currentRect.height !== 0) {
        drawRect(currentRect); // 绘制当前矩形  
        regions.forEach(function (item, index) {
            item.isSelected = false;
        });
    }

    // 绘制所有矩形  
    regions.forEach(rect => {
        ctx.beginPath();
        ctx.rect(rect.startX, rect.startY, rect.width, rect.height);
        ctx.lineWidth = 2; // 正常矩形的线宽
        ctx.strokeStyle = rect.isSelected ? 'red' : 'green'
        ctx.stroke();

        //显示文字
        if (rect.index) {
            ctx.font = "16px Arial";
            ctx.fillStyle = "black";
            ctx.textAlign = 'center';
            ctx.textBaseline = 'middle';
            var name = "Region " + rect.index.toString();
            ctx.fillText(name, rect.startX + rect.width / 2, rect.startY + rect.height / 2);
        }
    });
}

function drawRect(rect) {
    var canvas = document.getElementById(CanvaseId);
    var ctx = canvas.getContext('2d');
    ctx.beginPath();
    ctx.lineWidth = 2; // 例如,使用更宽的线宽  
    ctx.strokeStyle = 'red'; // 使用红色边框
    ctx.rect(rect.startX, rect.startY, rect.width, rect.height);
    ctx.stroke();

    //显示文字
    if (rect.index) {
        ctx.font = "16px Arial";
        ctx.fillStyle = "black";
        ctx.textAlign = 'center';
        ctx.textBaseline = 'middle';
        var name = "Region " + rect.index.toString();
        ctx.fillText(name, rect.startX + rect.width / 2, rect.startY + rect.height / 2);
    }
}

//删除矩形
function deleteDraw(index) {
    regions = regions.filter(function (item) {
        return item.index !== index;
    });
    drawRegion(); // 重新绘制
}

//获取所有图形
function GetAllRectangle() {
    return regions;
}

//渲染矩形
function RenderRectangle(rects) {
    regions = [];
    for (let i = rects.length - 1; i >= 0; i--) {
        var rect = rects[i];
        var insert = new Region(rect.startX, rect.startY, rect.width, rect.height, rect.name, false);
        regions.push({ ...insert }); // 存储完成的矩形  
    }
    drawRegion();
}
@inject IJSRuntime jsRuntime

protected override async Task OnAfterRenderAsync(bool firstRender)
{

    await jsRuntime.InvokeVoidAsync("import", "./drawRect.js");
    await jsRuntime.InvokeVoidAsync("clearCanvasRect");//调用js clearCanvasRect 方法
}

js 操作c#

 

P13_Blazor项目模板讲解ThreeBlazor2020_1_11.rar Blazor与Flexsilverlight有点像,Flexsilverlight有一些大厂反对,不支持flexsilverlight Blazor使用Web Assembly标准,Web Assembly是一种业界标准,所有浏览器都支持它,类似于Java字节码,各种语言都可以编译过去 WebAssemblyBlazor:解决了一个存在十年的老问题 WebAssembly 是一种新的客户端技术,可以在所有现代浏览器(包括移动浏览器)中实现近乎原生的性能,而且不需要插件。 许多语言,包括 C、C#、Go Rust,都可以编译成面向基于栈的 WebAssembly 虚拟机的代码。 .NET 代码可以在任何地方运行,包括浏览器内部。 Blazor 是一个客户端库,它在 WebAssembly 上使用.NET 来支持借助 Razor 模板使用 C# 编写的单页应用程序。 Blazor 支持代码重用将遗留代码移植到现代 Web 应用程序的能力。 在 2019 年 4 月中旬,微软悄悄地推出了一个年轻的框架,从“一切皆有可能”的实验阶段过渡到“我们致力于实现这一目标”的预览版。这个框架名为Blazor,因为它在浏览器中运行,并利用了一个名为 Razor 的模板系统或“视图引擎”,促成了这个.NET 开发人员几乎放弃了的场景。它不仅允许开发人员使用 C# 构建客户端代码(不需要 JavaScript),还允许开发人员在没有插件的情况下在浏览器中运行现有的.NET 标准 DLL。 https://blog.csdn.net/sD7O95O/article/details/91667930 通过Blazor使用C#开发SPA单页面应用程序(1) - 简介及特点 https://www.cnblogs.com/liuxtj/archive/2019/08/13/11344539.html Blazor是一个新的Web UI框架,使用C#,RazorHTML以及WebAssembly (W3C标准)。它允许您使用C#而不是JavaScript构建交互式Web UI。Blazor应用程序由使用C#,HTMLCSS实现的可重用Web UI组件组成。客户端服务器代码都是用C#编写的,允许您共享代码库。 在WebAssembly或服务器上运行 Blazor可以使用WebAssembly直接在浏览器中运行客户端C#代码。因为它是在WebAssembly上运行的真实.NET,所以您可以从应用程序的服务器端部分重用代码库(客户端渲染)。 或者,Blazor可以在服务器上运行您的客户端逻辑。客户端UI事件使用SignalR(实时消息传递框架)发送回服务器。执行完成后,所需的UI更改将发送到客户端并合并到DOM中(服务器端渲染)。 Web Assembly (Wasm) 基于W3C开放标准,用于在浏览器中运行低级字节代码。使用此标准,我们可以直接在浏览器中运行服务器端语言(Rust,C ++,C#...)而不是Javascript。 还记得Java appletMicrosoft Silverlight吗,我们必须在浏览器中安装插件来运行JavaC#代码,但是WebAssembly提供了基本标准,现在我们不需要任何插件,他的二进制格式以.wasm文件表示,能够提供接近本机的性能。 Blazor ● 基于Component的编程模型,Blazor是用来写组件的 Blazor宿主模型 host model ● 客户端 Client Side ● 服务器端 Server Side 客户端宿主模型 Server Browser Components -----+mono ------> Components c# Assemblies/DLLs Javascript 将dll从服务器端传送到客户端的同时,客户端浏览器不懂这些c#写的dll, 因此还会传送一个特制版本的mono Mono ● 也是一个开源的.NET Framework ● 它可以解释IL,中间语言 ● 代码的IL是包含在.NET的Assembly里面 ● 浏览器之所以可以执行mono,是因为它接收到的mono版本是使用 一种类似汇编(Assembly)的低级语言编写的。而浏览器可以理解 这种语言,它就是WebAssembly. ● 然后
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值