在Wpf C#

问题描述

您好,我正在应用程序中画一条线。我正在使用Caliburn.Micro MVVM Framework。在我的DICOM图像中,我可以使用“指针”绘制一条线并计算距离。我使用3个事件MouseDown,MouseMove和MouseUp。我左键单击鼠标,然后松开鼠标,然后松开。我的问题是,当我移动鼠标时,有时可能会使用Graphics.Drawline绘制线改变方向,但是当我在最后一点时,应该使用直线。但是当我移动鼠标时,它也有另一条线,该线也不属于该线。请查看我所做的

enter image description here

应该是一条清晰的线,因为有时我的鼠标会在那一点上移动颜色。有一个著名的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(_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为您绘制基本体的效率低。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...