2013-05-12 2 views
2

저는 C#에서 WPF 응용 프로그램을 사용하고 있으며 처음에는 삼각형을 그려야합니다. 컨트롤에 액세스 - 지시문 또는 어셈블리 참조가 없습니다.

내가 프로그램을 실행할 때 나타나는 오류입니다 :

을 'WpfApplication1.mainWindow' 'mainViewport'에 대한 정의와 첫 번째 인수를 받아들이는 'mainViewport'에 대한 더 확장 메서드가 포함되어 있지 않습니다 형식의 'WpfApplication1.mainWindow'찾을 수 있습니다. (당신은 using 지시문 또는 어셈블리 참조가?) 여기

내 XAML 페이지입니다 :

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="WPF 3D Chart" Height="455" Width="689"> 
    <Grid> 
     <Viewport3D Name="mainViewport" ClipToBounds="True"> 
      <Viewport3D.Camera> 
       <PerspectiveCamera 
    FarPlaneDistance="100" 
    LookDirection="-11,-10,-9" 
    UpDirection="0,1,0" 
    NearPlaneDistance="1" 
    Position="11,10,9" 
    FieldOfView="70" /> 
      </Viewport3D.Camera> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <DirectionalLight 
    Color="White" 
    Direction="-2,-3,-1" /> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
     </Viewport3D> 
    </Grid> 
</Window> 

이 내 코드입니다 : (오류 내 코드의 마지막 줄에 나타납니다 코드가 WpfApplication1.MainWindow라는 클래스를 수정하는 동안)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

using System.Windows.Media.Media3D; 


namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      System.Windows.Media.Media3D.Point3D point0 = new Point3D(-0.5, 0, 0); 
      System.Windows.Media.Media3D.Point3D point1 = new Point3D(0.5, 0.5, 0.3); 
      System.Windows.Media.Media3D.Point3D point2 = new Point3D(0, 0.5, 0); 


      System.Windows.Media.Media3D.MeshGeometry3D triangleMesh = new MeshGeometry3D(); 

      triangleMesh.Positions.Add(point0); 
      triangleMesh.Positions.Add(point1); 
      triangleMesh.Positions.Add(point2); 

      int n0 = 0; 
      int n1 = 1; 
      int n2 = 2; 

      triangleMesh.TriangleIndices.Add(n0); 
      triangleMesh.TriangleIndices.Add(n1); 
      triangleMesh.TriangleIndices.Add(n2); 

      System.Windows.Media.Media3D.Vector3D norm = new Vector3D(0, 0, 1); 
      triangleMesh.Normals.Add(norm); 
      triangleMesh.Normals.Add(norm); 
      triangleMesh.Normals.Add(norm); 

      System.Windows.Media.Media3D.Material frontMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Blue)); 

      System.Windows.Media.Media3D.GeometryModel3D triangleModel = new GeometryModel3D(triangleMesh, frontMaterial); 

      triangleModel.Transform = new Transform3DGroup(); 

      System.Windows.Media.Media3D.ModelVisual3D visualModel = new ModelVisual3D(); 
      visualModel.Content = triangleModel; 

      this.mainViewport.Children.Add(visualModel); //here appears the error   
     } 
    } 
} 
+0

그리드 내부에 있기 때문에 Viewport3D 컨트롤에 액세스 할 수 없습니다. 그리드의 자식 컨트롤을 통해 액세스해야합니다. FindName() 메서드를 사용하십시오. –

+0

@ShaiAharoni는 완전히 사실이 아닙니다. 너무 나쁜 나는 의견을 downvote 수 없습니다 –

답변

1

생성자에서 뷰포트를 참조하고 있습니다. 그 순간 뷰포트가 아직 생성되지 않았습니다.

빈 생성자를 두지 마십시오이

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     Loaded="Window_Loaded"> 
    <Grid> 

처럼 윈도우의로드 이벤트 핸들러를 사용! 거기에 중요한 전화가 있습니다! InitializeComponent는 Window의 UI를로드합니다.

코드에서 해당 호출을 제거했다면 코드가 중단됩니다. Loaded 핸들러를 사용하십시오.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 


    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 
+0

나는 당신이하는 말의 더 큰 생각을 갖게됩니다. 잘 이해된다면, 생성자를 "Public Main Window() {}"를 비워두고 다른 곳에서 코드를 작성한다는 의미입니까? 그렇다면 윈도우의로드 된 이벤트 핸들러는 무엇을 의미합니까? – ahmad

+0

나는 나의 대답을 추가했고 나는 또한 당신의 오류를 발견했다고 생각한다. –

+0

당신은 맞습니다. 처음에는 InitializeComponent()가 무엇인지에 대한 지식이 없으므로 삭제했습니다. 고마워, 지금은 작동! – ahmad

1

귀하의 XAML은 WPFChart.Window1라는 클래스를 생성합니다. 나는 어느 것이 옳은지 모르지만 그 중 하나를 변경하여 일치시켜야합니다.

+0

감사합니다, 당신 말이 맞아! 방금 변경했는데 오류가 표시되지 않습니다. 그러나이 프로그램은 여전히 ​​실행될 수 없으며 "소스를 사용할 수 없습니다 - 어떤 호출 스택 프레임에도 심볼이로드되지 않습니다. 소스 코드를 표시 할 수 없습니다". 어떤 생각을 고치는 방법? – ahmad

관련 문제