I think there is a more suitable and simple method. Instead of calculating the sizes, use the same values and try the LayoutTransform:
<Grid>
<Canvas Background="LightGray" UseLayoutRounding="False">
<!-- First 50 -TextBox -->
<TextBox Text="qwerqwrwqrqwer"
Width="123.73419189453125" Height="27.833353042602539"
FontSize="16"
FontFamily="Arial"
BorderThickness="0"
Canvas.Left="20" Canvas.Top="20"
HorizontalAlignment="Left"
VerticalAlignment="Top"
TextWrapping="Wrap"
Margin="0" >
<TextBox.LayoutTransform>
<ScaleTransform ScaleX="0.5" ScaleY="0.5"/>
</TextBox.LayoutTransform>
</TextBox>
<!-- Second 100- TextBox -->
<TextBox Text="qwerqwrwqrqwer"
Width="123.73419189453125" Height="27.833353042602539"
FontSize="16"
FontFamily="Arial"
BorderThickness="0"
Canvas.Left="200" Canvas.Top="20"
HorizontalAlignment="Left"
VerticalAlignment="Top"
TextWrapping="Wrap"
Margin="0" />
<!-- Third 200- TextBox -->
<TextBox Text="qwerqwrwqrqwer"
Width="123.73419189453125" Height="27.833353042602539"
FontSize="16"
FontFamily="Arial"
BorderThickness="0"
Canvas.Left="20" Canvas.Top="100"
HorizontalAlignment="Left"
VerticalAlignment="Top"
TextWrapping="Wrap"
Margin="0" >
<TextBox.LayoutTransform>
<ScaleTransform ScaleX="2" ScaleY="2"/>
</TextBox.LayoutTransform>
</TextBox>
<!-- Fourth 400 -TextBox -->
<TextBox Text="qwerqwrwqrqwer"
Width="123.73419189453125" Height="27.833353042602539"
FontSize="16"
FontFamily="Arial"
BorderThickness="0"
Canvas.Left="200" Canvas.Top="200"
HorizontalAlignment="Left"
VerticalAlignment="Top"
TextWrapping="Wrap"
Margin="0" >
<TextBox.LayoutTransform>
<ScaleTransform ScaleX="4" ScaleY="4"/>
</TextBox.LayoutTransform>
</TextBox>
</Canvas>
</Grid>
See also: RenderTransform.