Можно ли поместить в словарь ресурсов Transform3DGroup с привязкой?

Я пытаюсь создать 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>

Можно ли избежать перезаписи Transform3DGroup для каждого ModelVisual3D, учитывая, что они почти одинаковы?

Спасибо


person Roberto    schedule 15.05.2011    source источник


Ответы (1)


Я не думаю, что есть способ сделать это с ресурсами, как предлагает ваш заголовок, потому что вы сможете указать привязку только один раз.

Однако вы можете написать класс, производный от 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, чтобы установить все остальные части включенных преобразований.

Это не сэкономит вам много, если вы действительно просто делаете это дважды, но если вы делаете это много раз, это может стоить того.

person Tim    schedule 15.05.2011
comment
Невозможно получить из запечатанного класса, поскольку Transform3DGroup - person Roberto; 15.05.2011