C# 画布上的绘图未正确保存WPF

C# 画布上的绘图未正确保存WPF,c#,wpf,C#,Wpf,我在画布中有一个图像,用户可以在图像中单击,并在用户单击的位置显示一个绿色点 我想将图像保存在内存流中以供以后使用,所有图像保存都很好,除了似乎没有正确绘制的点,我的猜测是关于绘制绿点时必须应用的屏幕比例,因为显示的图像比源图像小 XAML: OnMouseLeftButtonDown(用于绘制椭圆的单击方法) 有什么办法可以纠正这种行为吗 提前谢谢 只要在代码中设置UIElement的属性,它就不会立即呈现。只有在返回该方法后才能执行此操作 在这种情况下,仅在更新其位置后尝试保存省略号将不

我在画布中有一个图像,用户可以在图像中单击,并在用户单击的位置显示一个绿色点

我想将图像保存在内存流中以供以后使用,所有图像保存都很好,除了似乎没有正确绘制的点,我的猜测是关于绘制绿点时必须应用的屏幕比例,因为显示的图像比源图像小

XAML:

OnMouseLeftButtonDown(用于绘制椭圆的单击方法)

有什么办法可以纠正这种行为吗


提前谢谢

只要在代码中设置UIElement的属性,它就不会立即呈现。只有在返回该方法后才能执行此操作

在这种情况下,仅在更新其位置后尝试保存省略号将不会保存新位置,而是保存其原始位置(0,0),因为其未设置

要解决此问题,请将Save()方法移动到另一个事件或调用

ImageCanvas.UpdateLayout(); 

更新省略号图标的位置后。

您的问题是,您没有显示如何在单击时添加该点。我认为,如果单击时将该点添加到正确的位置,屏幕比例不会有问题。您是否设置了省略号的位置并用相同的方法保存?感谢您的评论,我已经编辑了问题以添加所需的代码@ShivaniKatukota是的,我现在正在这样做,稍后我将从中提取保存方法。在另一个事件中提取保存方法,然后尝试…我有一个类似的问题,椭圆图标的位置在该事件完成之前不会更新,所以在保存时总是为我保存最后一点。你只需保存我的一天,如果你详细说明答案,我会马上接受,谢谢!
public void DrawEllipse()
{
    // Adjust To Canvas
    (double x, double y) = AdjustToCanvas(Mouse.GetPosition(ImageCanvas));

    // Center Ellipse
    x -= EllipseClick.Width / 2;
    y -= EllipseClick.Height / 2;

    Canvas.SetLeft(EllipseClick, x);
    Canvas.SetTop(EllipseClick, y);
}
public void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DrawEllipse();
    
    Point point = Mouse.GetPosition(SelectedPartImage);
    
    if (!(point.ConvertWPFPointToImagePoint(
                  SelectedPartImageSource.PixelWidth,
                  SelectedPartImageSource.PixelHeight,
                  SelectedPartImage.ActualWidth,
                  SelectedPartImage.ActualHeight))
    {
        return;
    }

    // CheckAlpha checks that the clicked point is inside the image and not outside of it.
    SelectPositionSuccess = CheckAlpha((int)point.X, (int)point.Y);

    EllipseClick.Visibility = SelectPositionSuccess ? Visibility.Visible : Visibility.Hidden;

    if (SelectPositionSuccess)
    {
        //Saving the Canvas
        RenderTargetBitmap rtb = new RenderTargetBitmap(
            (int)SelectedPartImageSource.Width,
            (int)SelectedPartImageSource.Height,
            96d,
            96d,
            System.Windows.Media.PixelFormats.Default);

        rtb.Render(ImageCanvas);

        //endcode as PNG
        PngBitmapEncoder pngEncoder = new PngBitmapEncoder();
        pngEncoder.Frames.Add(BitmapFrame.Create(rtb));

        //save to memory stream
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        pngEncoder.Save(ms);
        ms.Close();

        var bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.StreamSource = ms;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.EndInit();

        System.IO.File.WriteAllBytes("test.png", ms.ToArray());
    }
}
ImageCanvas.UpdateLayout();