Не умещается в комментарий, поэтому ответом сделаю :)
Насколько я понимаю, значение свойства FrameworkElement.ActualWidth вычисляется непосредственно после прохождения отрисовки. Если попытаться получить значение в конструкторе (т.е. на этапе создания, еще до отрисовки элемента), то это значение справедливо будет равно значению по-умолчанию, т.е. 0.
Пример:
Window1.xaml:
<Window x:Class="WpfApplication2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBox x:Name="tbxButtonText" Grid.Row="0" />
<Button Grid.Row="1" Content="Get width" Click="ButtonBase_OnClick" />
</Grid>
</Window>
Window1.xaml.cs:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
MessageBox.Show(string.Format("Width: {0}; Height: {1}", tbxButtonText.ActualWidth, tbxButtonText.ActualHeight));
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
MessageBox.Show(string.Format("Width: {0}; Height: {1}", tbxButtonText.ActualWidth, tbxButtonText.ActualHeight));
}
}
При запуске, еще до отрисовки окна будет показан MessageBox, в нем значения высоты и ширины будут нулевые. После отрисовки окна, при клике на кнопку ширина и высота будут показывать верные значения.
Возможно та же причина. Попробуй рассмотреть методы Measure(), MeasureCore() и UpdateLayout() класса UIElement. Может они помогут решить проблему.