如何解决在Wpf C#
您好,我正在应用程序中画一条线。我正在使用Caliburn.Micro MVVM Framework。在我的DICOM图像中,我可以使用“指针”绘制一条线并计算距离。我使用3个事件MouseDown,MouseMove和MouseUp。我左键单击鼠标,然后松开鼠标,然后松开。我的问题是,当我移动鼠标时,有时可能会使用Graphics.Drawline绘制线改变方向,但是当我在最后一点时,应该使用直线。但是当我移动鼠标时,它也有另一条线,该线也不属于该线。请查看我所做的
应该是一条清晰的线,因为有时我的鼠标会在那一点上移动颜色。有一个著名的DICOM Viewer应用程序名称Radiant在这里您可以看到 线是直的。 这是我的代码
<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(_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(_secondPoint.Y)));
double distanceInMM = patientCoord1.distance(patientCoord2);
disTanceInMM = distanceInMM;
}
}
请帮助我提前谢谢。很长的问题。
解决方法
您可能不应该直接在图像上绘制。这是相当低效的,并且您还将遇到遇到的问题。更好的方法是使用线条和其他图形创建覆盖。有关示例,请参见问题how to bind lines to a canvas。
如果将项目控件和图像放在同一网格中,则项目控件应像叠加层一样工作。即
<Grid>
<Image>
<!--... -->
</Image>
<ItemsControl ItemsSource="{Binding Lines}">
<!--...-->
</ItemsControl>
</Grid>
您可以对位图叠加使用相同的方法,但这要比让wpf为您绘制基本体的效率低。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。