Matthew,正如您所指出的,如果您应用转换ActualWidth
,ActualHeight
请不要更改。ActualWidth
并ActualHeight
表示布局系统计算完控件大小后计算出的宽度/高度(基于 ,Margin
等值HorizontalAlignment
)
考虑到已应用到它的所有比例变换来获取控件大小的一种方法是向上走可视化树并将所有比例变换应用于控件的ActualWidth
和ActualHeight
:
public static Size GetActualSize(FrameworkElement control)
{
Size startSize = new Size(control.ActualWidth, control.ActualHeight);
// go up parent tree until reaching root
var parent = LogicalTreeHelper.GetParent(control);
while(parent != null && parent as FrameworkElement != null && parent.GetType() != typeof(Window))
{
// try to find a scale transform
FrameworkElement fp = parent as FrameworkElement;
ScaleTransform scale = FindScaleTransform(fp.RenderTransform);
if(scale != null)
{
startSize.Width *= scale.ScaleX;
startSize.Height *= scale.ScaleY;
}
parent = LogicalTreeHelper.GetParent(parent);
}
// return new size
return startSize;
}
public static ScaleTransform FindScaleTransform(Transform hayStack)
{
if(hayStack is ScaleTransform)
{
return (ScaleTransform) hayStack;
}
if(hayStack is TransformGroup)
{
TransformGroup group = hayStack as TransformGroup;
foreach (var child in group.Children)
{
if(child is ScaleTransform)
{
return (ScaleTransform) child;
}
}
}
return null;
}
请记住,如果您的可视化树很深或者您多次执行此操作,这可能效率低下。然而,在实践中,我从来没有遇到过任何问题。