2

UIElement在 WPF/Silverlight 中,我可以在应用转换后获得 a 的计算值吗?

(根据下面的评论):

我有一个堆栈面板,我已经应用了一个TranformGroup。该组中有两个平移和一个比例变换。

(警告,前面的伪代码)

groupTransform.children.add(new TranslateTransform());
groupTransform.children.add(new ScaleTransform());
groupTransform.children.add(new TranslateTransform());
containerToScale.RenderTransform = groupTransform;
...
// code that sets values to all the transforms

显然,比例变换是我最感兴趣的。

4

3 回答 3

3

Matthew,正如您所指出的,如果您应用转换ActualWidthActualHeight请不要更改。ActualWidthActualHeight表示布局系统计算完控件大小后计算出的宽度/高度(基于 ,Margin等值HorizontalAlignment

考虑到已应用到它的所有比例变换来获取控件大小的一种方法是向上走可视化树并将所有比例变换应用于控件的ActualWidthActualHeight

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;
}

请记住,如果您的可视化树很深或者您多次执行此操作,这可能效率低下。然而,在实践中,我从来没有遇到过任何问题。

于 2012-08-31T00:10:23.960 回答
2

您可以简单地应用转换:

control.LayoutTransform.Transform(new Point(0,0))

于 2009-07-23T08:42:26.757 回答
1

是的,您可以检查ActualWidthActualHeight解决任何FrameworkElement问题。如果您有隐藏的元素,您需要检查它是否可见。

如果您想知道控件加载后使用Loaded事件。

于 2009-07-23T08:20:09.050 回答