簡體   English   中英

在 Wpf C# 中畫一條直線

[英]Draw a Straight Line In Wpf C#

你好,我正在我的應用程序中畫一條線。 我正在使用 Caliburn.Micro MVVM 框架。 在我的 DICOM 圖像中,我可以使用 Pointer 和 Calculate distance 畫一條線。 我使用 3 個事件 MouseDown、MouseMove 和 MouseUp。 我左鍵單擊我的鼠標,然后如果我松開我就移動我能夠 Draw 。 我的問題是當我移動鼠標時,它有時會使用 Graphics.Drawline 繪制線改變方向,但是當我在最后一點時,它應該是 Straight line 。 但是當我移動我的鼠標時,它的另一點也有不屬於這條線的線。 請看看我做了什么在此處輸入圖片說明

它應該是一條直線,因為有時我的鼠標會在那個點移動顏色。有一個著名的 DICOM 查看器應用程序名稱 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 類中的 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;
        }

    }

請幫助我在此先感謝。抱歉問了這么長的問題。

您可能不應該直接在圖像上繪制。 這是相當低效的,而且你也會遇到和你一樣的問題。 更好的方法是使用線條和其他圖形創建疊加層,請參閱如何將線條綁定到畫布示例中的問題如何執行此操作。

如果您將項目控件和圖像放在同一個網格中,項目控件應該像疊加層一樣工作。 IE

<Grid>
    <Image>
        <!--... -->
    </Image>
    <ItemsControl ItemsSource="{Binding Lines}">
        <!--...-->
    </ItemsControl>
</Grid>

您可以對位圖疊加使用相同的方法,但這比讓 wpf 為您繪制圖元效率低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM