【发布时间】:2019-12-30 01:22:10
【问题描述】:
我有一个 ASP.NET 应用程序,它允许用户单击或点击画布以指示身体图像上的疼痛位置。身体图像显示在 Canvas 上,并且与 Canvas 的大小相同。
function drawBodyMap() {
var c = document.getElementById('myCanvas');
var ctx = c.getContext('2d');
var imageObj = new Image();
imageObj.src = 'https://.../body.jpg';
imageObj.onload = function () {
ctx.drawImage(imageObj, 0, 0, 600, 367);
};
}
<canvas id="myCanvas" width="600" height="367"></canvas>
<script>
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
canvas.addEventListener('mouseup', function (evt) {
if (ixPos > 9)
return;
var mousePos = getMousePos(canvas, evt);
bodyX[ixPos] = mousePos.x;
bodyY[ixPos] = mousePos.y;
painType[ixPos] = pain_type;
ixPos++;
ctx.beginPath();
ctx.arc(mousePos.x, mousePos.y, 8, 0, 2 * Math.PI);
if (pain_type == 1)
ctx.fillStyle = "#DC143C";
else if (pain_type == 2)
ctx.fillStyle = "#EA728A";
else if (pain_type == 3)
ctx.fillStyle = "#DAA520";
else if (pain_type == 4)
ctx.fillStyle = "#008000";
else if (pain_type == 5)
ctx.fillStyle = "#4169E1";
ctx.fill();
}, false);
</script>
在身体图像上添加到画布的 X、Y 点被保存到数据库中。然后将这些点加载到 WPF 应用程序中,该应用程序在 XAML 画布上显示相同的正文图像。然后 C# 代码在图像上添加点。
WPF 代码:
private void DisplayBodyPain()
{
List<BodyPain> pain = gFunc.sws.GetBodyPain(MemberID);
foreach (BodyPain bp in pain)
{
Border b = new Border();
b.Tag = bp.PainType.ToString();
b.Cursor = Cursors.Hand;
b.Width = 16;
b.Height = 16;
b.CornerRadius = new CornerRadius(8);
b.Background = GetPainBrush((byte)bp.PainType);
cvsBody.Children.Add(b);
Canvas.SetTop(b, bp.YPos);
Canvas.SetLeft(b, bp.XPos);
}
}
我遇到的问题是在 XAML 画布上绘制的点都与在 HTML 画布上绘制的点略有不同。每个点都不在完全相同的位置。
有什么办法可以解决这个问题吗?我应该采取不同的做法吗?
【问题讨论】:
-
由于 WPF 版本不能正常工作,您应该包含绘制 WPF 版本的代码。
-
我不是投反对票的人,但这根本不是一个好问题,当然也不是an mcve。这种东西通常归结为弧坐标以它们的坐标为中心,而 WPF 与左上角对齐。但正如@Keith Stein 指出的那样,您至少需要显示您的 WPF 代码,最好是 mcve。
标签: html wpf xaml asp.net-core html5-canvas