当行为 canvas 的 children 时,如何使用 stretch = Uniform 定位图像?

How to position images with stretch = Uniform when children of a canvas from a behavior?

我的行为是将图像添加为 canvas 的 children:

 private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var behavior = d as ImageCanvasBehavior;
            if (behavior == null)
                return;

            // The AssoicatedObjec is a Canvas.
            Canvas canvas = behavior.AssociatedObject as Canvas;
            if (canvas == null)
                return;

            canvas.Children.Clear();

            CroppedBitmap b = (CroppedBitmap)e.NewValue;          

            Image img = new Image();
            img.Source = b;
            img.Width = canvas.ActualWidth;
            img.Stretch = Stretch.Uniform;

            canvas.Children.Add(img);
        }

img 添加在 canvas 的水平和垂直的中间位置。他们如何定位到 canvas 的 top-left?

TIA

编辑#1 第一次尝试视觉树:

编辑#2 我认为这是错误的...应该只显示图像,而不是图像上方和下方的所有黑色 space 并且图像不应被剪切掉。

使用附件属性:

        Image img = new Image();
        img.Source = b;
        img.Width = canvas.ActualWidth;
        img.Stretch = Stretch.Uniform;
        Canvas.SetTop(img, 0);
        Canvas.SetLeft(img, 0);

问题已解决。 croppedbitmap 来自位于网格内的 inkcanvas 上的图像。 inkcanvas 左上角的参考点取为:

//translate point to get the position of the media element 
var p = ic.PointToScreen(new Point(0, 0));

正确的参考点是通过以下方式获得的:

var p = ic.TranslatePoint(new Point(0, 0), ic.Parent as UIElement);

修复此问题后,其他所有内容都会恢复正常。