2

UIElementWPF/Silverlight では、変換が適用された後に計算された値を取得できますか?

(以下のコメントによる):

スタック パネルがあり、それに適用しTranformGroupました。このグループには、2 つの変換と 1 つのスケール変換があります。

(警告、疑似コードが先にある)

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

マシュー、あなたが指摘したようにActualWidthActualHeight変換を適用しても変わらない. 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;
}

ビジュアル ツリーが深い場合や、これを何度も実行する場合、これは非効率になる可能性があることに注意してください。ただし、実際には、これで問題が発生したことはありません。

于 2012-08-31T00:10:23.960 に答える
2

単純に変換を適用できます。

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

于 2009-07-23T08:42:26.757 に答える
1

はい、あなたはこれActualWidthを理解するためにチェックすることができます。非表示の要素がある場合でも、表示されているかどうかを確認する必要があります。ActualHeightFrameworkElement

コントロールがロードされた後で知りたい場合は、Loadedイベントを使用してください。

于 2009-07-23T08:20:09.050 に答える