Хотя пост довольно старый, я просто воспользовался приведенным выше кодом и хотел поделиться своим решением на тот случай, если кому-то еще понадобится:
public MainWindow()
{
InitializeComponent();
this.SizeChanged += new SizeChangedEventHandler(MainWindow_SizeChanged);
}
void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
var midValueConverter = new MidValueConverter();
double left = (double)midValueConverter.Convert(new object[] { cnvMain2.ActualWidth, tbSize2.ActualWidth }, typeof(double), null, Thread.CurrentThread.CurrentCulture);
Canvas.SetLeft(tbSize2, left);
double top = (double)midValueConverter.Convert(new object[] { cnvMain2.ActualHeight, tbSize2.ActualHeight }, typeof(double), null, Thread.CurrentThread.CurrentCulture);
Canvas.SetTop(tbSize2, top);
}