gpt4 book ai didi

c# - 在WPF C#中画一条直线

转载 作者:行者123 更新时间:2023-12-03 10:56:03 25 4
gpt4 key购买 nike

您好,我正在应用程序中画一条线。我正在使用Caliburn.Micro MVVM Framework。在我的DICOM图像中,我可以使用“指针”绘制一条线并计算距离。我使用3个事件MouseDown,MouseMove和MouseUp。我将鼠标左键单击,然后松开鼠标,然后松开。我的问题是,当我移动鼠标时,有时可能会使用Graphics.Drawline绘制线改变方向,但是当我在最后一点时,应该使用直线。但是当我移动鼠标时,它也有另一条线,该线也不属于该线。请看看我做了什么enter image description here
它应该是一条starigh线,因为有时我的鼠标此时仍将颜色移动。有一个著名的DICOM Viewer应用程序名称Radiant在这里您可以看到enter image description here
线是直的。
这是我的代码

  <Image    Grid.Row="3"  Grid.Column="2" Grid.ColumnSpan="4" 
x:Name="DIIMGFINAL" cal:Message.Attach="[Event MouseDown] = [Action MDownCalCulateDistance($source, $eventArgs)];
[Event MouseMove] = [Action MMoveCalCulateDistance($source, $eventArgs)];
[Event MouseUp] = [Action MUpCalCulateDistance($source, $eventArgs)]">
</Image>
这是ViewModel类中的MY C#代码。这是MouseDown事件
  public void MDownCalCulateDistance(object sender, System.Windows.Input.MouseEventArgs e)
{

if (!(sender is System.Windows.Controls.Image)) return;

_diIMGTemp = DIIMGFINAL;
if (_firstPoint.X == 0 && _firstPoint.Y == 0)
{
System.Windows.Point px1 = e.GetPosition((System.Windows.Controls.Image)sender);

_firstPoint = px1;

}
if (_secondPoint.X != 0 && _secondPoint.Y != 0)
{
System.Drawing.Bitmap drawbitmap = BitmapImage2Bitmap(DIIMGPrimary);

Graphics g;
using (g = Graphics.FromImage(drawbitmap))
{
g.DrawLine(Pens.Red, Convert.ToInt32(_firstPoint.X), Convert.ToInt32(_firstPoint.Y), Convert.ToInt32(_secondPoint.X), Convert.ToInt32(_secondPoint.Y));
g.Dispose();
}

Convert_BitMap_BitImage(drawbitmap);
DIIMGFINAL = DIIMGPrimary;

var geometry = new FrameGeometry(DicomDataSet);
var patientCoord1 = geometry.TransformImagePointToPatient(new Point2(Convert.ToInt32(_firstPoint.X), Convert.ToInt32(_firstPoint.Y)));
var patientCoord2 = geometry.TransformImagePointToPatient(new Point2(Convert.ToInt32(_secondPoint.X), Convert.ToInt32(_secondPoint.Y)));
double distanceInMM = patientCoord1.Distance(patientCoord2);
DisTanceInMM = distanceInMM;
//_firstPoint = new System.Windows.Point(0, 0);
//_secondPoint= new System.Windows.Point(0, 0);
// _isClicked = false;

}
}
这是MouseUp事件..
 public void MUpCalCulateDistance(object sender, System.Windows.Input.MouseEventArgs e)
{
_firstPoint = new System.Windows.Point(0, 0);
_secondPoint = new System.Windows.Point(0, 0);
}
最后一个是“鼠标移动事件”。
 public void MMoveCalCulateDistance(object sender, System.Windows.Input.MouseEventArgs e)
{
if (!(sender is System.Windows.Controls.Image)) return;

System.Windows.Point px = e.GetPosition((System.Windows.Controls.Image)sender);

XCoordinate = px.X;
YCoordinate = px.Y;

// if (_isClicked == false) return;
// MousePoint
if ((_firstPoint.X == 0 && _firstPoint.Y == 0))
{

return;
}
else
{
System.Windows.Point px2 = e.GetPosition((System.Windows.Controls.Image)sender);
_secondPoint = px2;
System.Drawing.Bitmap drawbitmap = BitmapImage2Bitmap(DIIMGPrimary);
Graphics g;
// g.Clear();
using (g = Graphics.FromImage(drawbitmap))
{
g.DrawLine(Pens.Red, Convert.ToInt32(_firstPoint.X), Convert.ToInt32(_firstPoint.Y), Convert.ToInt32(_secondPoint.X), Convert.ToInt32(_secondPoint.Y));
}

Convert_BitMap_BitImage(drawbitmap);
DIIMGFINAL = DIIMGPrimary;

var geometry = new FrameGeometry(DicomDataSet);
var patientCoord1 = geometry.TransformImagePointToPatient(new Point2(Convert.ToInt32(_firstPoint.X), Convert.ToInt32(_firstPoint.Y)));
var patientCoord2 = geometry.TransformImagePointToPatient(new Point2(Convert.ToInt32(_secondPoint.X), Convert.ToInt32(_secondPoint.Y)));
double distanceInMM = patientCoord1.Distance(patientCoord2);
DisTanceInMM = distanceInMM;
}

}
请帮我提前感谢。对不起,冗长的问题。

最佳答案

您可能不应该直接在图像上绘制。这是相当低效的,并且您还将遇到遇到的问题。更好的方法是使用线条和其他图形创建覆盖。有关示例,请参见问题how to bind lines to a canvas
如果将项目控件和图像放在同一网格中,则项目控件应像叠加层一样工作。 IE。

<Grid>
<Image>
<!--... -->
</Image>
<ItemsControl ItemsSource="{Binding Lines}">
<!--...-->
</ItemsControl>
</Grid>
您可以对位图覆盖使用相同的方法,但是这比让wpf为您绘制基元的效率低。

关于c# - 在WPF C#中画一条直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63898310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com