マシュー、あなたが指摘したようにActualWidth、ActualHeight変換を適用しても変わらない. ActualWidthレイアウト システムがコントロールのサイズの計算を終了した後に、計算された幅/高さを表す ( 、などActualHeightの値に基づく)。MarginHorizontalAlignment
適用されたすべてのスケール変換を考慮してコントロールのサイズを取得する 1 つの方法は、ビジュアル ツリーをたどり、すべてのスケール変換をコントロールの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;
}
ビジュアル ツリーが深い場合や、これを何度も実行する場合、これは非効率になる可能性があることに注意してください。ただし、実際には、これで問題が発生したことはありません。