2013-11-01 14 views
3

복잡한 3D 모델이 정의 된 일부보기의 XAML 파일이 있습니다. 문제는 모델을 정의하는 부분이 상당히 크고 0.5MB 이상이며 파일을 탐색하기가 정말 어렵다는 것입니다. 예를 들어 Model3DGroup을 다른 파일로 이동 한 다음 내 주요 XAML 파일에 포함시킬 수있는 방법이 있습니까? 나는 그 뿌리로 <Model3DGroup xmlns="..." xmlns:x="...">와 파일을 만드는 XAML 변환기에 SketchUp을 사용한다, 그래서 나는 그것이 편리한 방법으로 할 수 있다고 거의 확신한다.3D 개체 데이터를 별도의 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> 

나는 이런 식으로 뭔가 달성하고자 :

나의 현재 XAML 파일은 다음과 같다

McGarnagle의 대답은 일반적으로 OK입니다

<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을하지만, 제 경우에는 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> 

답변

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> 
+0

를, 그것은 아무튼 일하지 마라. Visual Studio는'ResourceDictionary' 항목에'x : Key' 속성이 필요하다고 말합니다. 다른 XAML의 'Model3DGroup'과 동일한 키를 사용하려고 할 때 R #은'ResourceDictionary'가 Models.xaml의 리소스를 숨 깁니다. – PiotrK

+0

''ResourceDictionary Source = "Models.xaml"/>'을'Viewport3D.Resources'로 옮겼습니다. 이제는'x : Key'가 없어도 괜찮은 것 같습니다 (아마'UserControl.Resources '). 이제는 "Content ="{...} "에 문제가 있습니다. ResourceDictionary 유형의 객체를 Model3D를 예상하는 속성에 적용 할 수 없다는 메시지가 나타납니다. – PiotrK

+0

내 대답에 편집 된 내용을 참조하십시오. – PiotrK