Due to the fact that IsManipulation is set to true, manipulate operations are handled preferentially.
By change it to false, e.Source gets element under the touch pointer.
If you want to keep it true and get element under the touch pointer , you can find with HitTest.
private void Canvas_TouchMove(object sender, TouchEventArgs e)
{
if (e.Source is FrameworkElement source)
{
var canvas = (Canvas)sender;
var point = e.GetTouchPoint(canvas).Position;
var hitresult = VisualTreeHelper.HitTest(canvas, point);
var hit = hitresult?.VisualHit;
if (hit != null)
{
FrameworkElement fe = hit as FrameworkElement;
if (fe?.TemplatedParent != null)
{
hit = fe.TemplatedParent;
}
}
if (hit is FrameworkElement element)
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss}\t{source.Name}\t{element.Name}");
}
}
else
{
Console.WriteLine("<NULL>");
}
}