将3D对象数据移动到单独的XAML文件中

时间:2013-11-01 00:09:15

标签: wpf xaml viewport3d

我有一个视图的XAML文件,其中定义了复杂的3D模型。问题是定义模型的部分非常大,它有超过0.5 MB,而且浏览文件真的很难。有没有办法可以将Model3DGroup移动到另一个文件中,然后将其包含在我的主XAML文件中?我使用SketchUp到XAML转换器创建以<Model3DGroup xmlns="..." xmlns:x="...">为根的文件,所以我几乎可以肯定它可以方便地完成。

我当前的XAML文件如下所示:

<UserControl x:Class="BigAtom.Views.WorkspaceView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:TestProj"
             mc:Ignorable="d" 
             d:DesignHeight="278" d:DesignWidth="274">

    <Grid x:Name="RootVisual" Background="Beige" ClipToBounds="True">
        <Canvas Name="DrawingCanvas" Grid.Row="0" Grid.Column="0" Width="0" Height="0" RenderTransform="1,0,0,-1,0,0" Margin="10">
            <Viewport3D Name="Object3D" Width="50" Height="50" Margin="-25,-25" ClipToBounds="False">
                <Viewport3D.Camera>
                    <OrthographicCamera x:Name="CamMain" Position="0 60 100" LookDirection="0 -60 -100"></OrthographicCamera>
                </Viewport3D.Camera>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <DirectionalLight x:Name="DirLightMain" Direction="-1,-1,-1"/>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D x:Name="MyModel">
                    <ModelVisual3D.Content>
                        <Model3DGroup>
                            <GeometryModel3D>
                                <GeometryModel3D.Geometry>
                                    <MeshGeometry3D Positions="-5.6166 10.4050 153.1136 [very long line]" TextureCoordinates="-5.616612 -10.405044  -3.582495 [very long line]" TriangleIndices="164 17 57 [very long line]"/>
                                </GeometryModel3D.Geometry>
                                <GeometryModel3D.Material>
                                    <DiffuseMaterial Color="White" Brush="#ffffff"/>
                                </GeometryModel3D.Material>
                                <GeometryModel3D.BackMaterial>
                                    <DiffuseMaterial Color="White" Brush="White"/>
                                </GeometryModel3D.BackMaterial>
                            </GeometryModel3D>
                        </Model3DGroup>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
            </Viewport3D>
        </Canvas>
    </Grid>
</UserControl>

我希望实现这样的目标:

<UserControl x:Class="BigAtom.Views.WorkspaceView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:TestProj"
             mc:Ignorable="d" 
             d:DesignHeight="278" d:DesignWidth="274">

    <Grid x:Name="RootVisual" Background="Beige" ClipToBounds="True">
        <Canvas Name="DrawingCanvas" Grid.Row="0" Grid.Column="0" Width="0" Height="0" RenderTransform="1,0,0,-1,0,0" Margin="10">
            <Viewport3D Name="Object3D" Width="50" Height="50" Margin="-25,-25" ClipToBounds="False">
                <Viewport3D.Camera>
                    <OrthographicCamera x:Name="CamMain" Position="0 60 100" LookDirection="0 -60 -100"></OrthographicCamera>
                </Viewport3D.Camera>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <DirectionalLight x:Name="DirLightMain" Direction="-1,-1,-1"/>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D x:Name="MyModel">
                    <ModelVisual3D.Content>
                        <Model3DGroup --- some kind of reference to the file which keeps the 3D model --- />
                    </ModelVisual3D.Content>
                </ModelVisual3D>
            </Viewport3D>
        </Canvas>
    </Grid>
</UserControl>

@edit

McGarnagle的回答通常没问题,但就我而言,我的DataTemplate中也定义了一些UserControl.Resources。因此,我不得不创建这样一个结构:

<UserControl.Resources>
    <ResourceDictionary>
        <DataTemplate DataType="{x:Type local:SomeType}" x:Key="SomeTypeTemplate">
            ....
        </DataTemplate>
        <ResourceDictionary.MergedDictionaries>
           <ResourceDictionary Source="Models.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

1 个答案:

答案 0 :(得分:2)

我想你应该可以使用资源字典。添加一个文件,例如“Models.xaml”,其定义为:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Model3DGroup x:Key="TheModelContent">
        ...
    </Model3DGroup>
</ResourceDictionary> 

然后引用UserControl中的文件,并使用StaticResource关键字引用模型:

<UserControl>
    <UserControl.Resources> 
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Models.xaml" />
            </ResourceDictionary.MergedDictionaries>

            <!-- other resources here -->
        </ResourceDictionary>
    </UserControl.Resources>
    ...

    <ModelVisual3D Content="{StaticResource TheModelContent}">
    ...

</UserControl>