是否可以将带有绑定的Transform3DGroup放入资源字典中?

时间:2011-05-15 09:53:22

标签: wpf data-binding 3d transform

我正在尝试创建一个3D场景来以图形方式表示我的模型。 我的模型包含N个对象(objA,objB,...),每个对象派生自一个抽象类,它具有一些属性,如Position,With,Height,Length等。

目前我的Viewport3D以这种方式完成:

<Viewport3D>
    ...
    <ModelVisual3D Content="{StaticResource objAView}">
        <ModelVisual3D.Transform>
            <Transform3DGroup>
                <ScaleTransform3D ScaleX="{Binding Path=objA.Width}" ScaleY="{Binding Path=objA.Height}" ScaleZ="{Binding Path=objA.Length}"/>
                <TranslateTransform3D OffsetX="{Binding Path=objA.Position.X}" OffsetY="{Binding Path=objA.Position.Y}" OffsetZ="{Binding Path=objA.Position.Z}"/>
            </Transform3DGroup>
        </ModelVisual3D.Transform>
    </ModelVisual3D>
    <ModelVisual3D Content="{StaticResource objBView}">
        <ModelVisual3D.Transform>
            <Transform3DGroup>
                <ScaleTransform3D ScaleX="{Binding Path=objB.Width}" ScaleY="{Binding Path=objB.Height}" ScaleZ="{Binding Path=objB.Length}"/>
                <TranslateTransform3D OffsetX="{Binding Path=objB.Position.X}" OffsetY="{Binding Path=objB.Position.Y}" OffsetZ="{Binding Path=objB.Position.Z}"/>
            </Transform3DGroup>
        </ModelVisual3D.Transform>
    </ModelVisual3D>
    ...
</Viewport3D>

是否可以避免为每个ModelVisual3D重写Transform3DGroup,因为它们几乎相同?

由于

1 个答案:

答案 0 :(得分:0)

我不认为有一种方法可以按照标题建议的方式使用资源,因为你只能指定一次绑定。

但是,您可以编写一个派生自Transform3DGroup的类,并对objA和obB的任何内容进行单一绑定。所以你可以在你的代码中找到类似的东西:

<Viewport3D>
    ...
    <ModelVisual3D Content="{StaticResource objAView}">
        <ModelVisual3D.Transform>
            <custom:MyTransform3DGroup ObjectToBindAgainst="{Binding objA}" />
        </ModelVisual3D.Transform>
    </ModelVisual3D>
    <ModelVisual3D Content="{StaticResource objBView}">
        <ModelVisual3D.Transform>
            <custom:MyTransform3DGroup ObjectToBindAgainst="{Binding objB}" />
        </ModelVisual3D.Transform>
    </ModelVisual3D>
    ...
</Viewport3D>

然后在您的自定义类中,您可以使用ObjectToBindAgainst来设置所包含的变换的所有其他部分。

如果你真的只是两次这样做,它并没有为你节省很多,但如果你多次这样做,那可能是值得的。