Ok, someone gave some great direction on another forum, so credit here goes to Min Zhu, just wanted to share it as it's a popular question it seems:
I first created a value converter for Width to Thickness:
[ValueConversion(typeof(double), typeof(Thickness))]
public class ThicknessConverterFrom : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double width = (double)value;
Thickness t = new Thickness(width, 0, 0 - width, 0);
return t;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
Thickness t = (Thickness)value;
double width = new double();
width = t.Left;
return width;
}
}
[ValueConversion(typeof(double), typeof(Thickness))]
public class ThicknessConverterTo : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double width = (double)value;
Thickness t = new Thickness(0 - width, 0, width, 0);
return t;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
Thickness t = (Thickness)value;
double width = new double();
width = t.Left;
return width;
}
}
Then bound it as follows:
<ThicknessAnimation Duration="0:0:.5" Storyboard.TargetProperty="Margin" To="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=ActualWidth, Converter={StaticResource thicknessConvFrom}}" AccelerationRatio=".9"/>