2016-10-31 2 views
1

매우 느린 WinForms 앱의 레거시 코드를 WPF로 포팅 (또는 시도)하려고합니다. WinForms 앱은 큰 이미지를 렌더링 할 때 쓰러지며, 사용자가 주변을 돌아 다니면서 자주 돌아와야하므로 다시 렌더링해야합니다.프로그래밍 방식으로 WPF xaml 정의 캔버스에 간단한 모양을 그리는 방법

xaml에서 테두리의 사용자 지정 하위 항목을 확대/축소 및 패닝 할 수있는 xaml에 캔버스를 그릴 수있는 시스템이 있습니다. xaml에서 상상적으로 "canvas"로 이름이 지정되었습니다. 다른 클래스의 캔버스에 간단한 타원을 그리는 데 문제가 있습니다.

namespace ZoomPan 
{ 
    public class DisplayManager 
    { 
     protected void DrawIcon(Locale locale, Color color) 
     { 
      Brush sensorBrush = new SolidColorBrush(color); 
      Brush sensorOutline = new SolidColorBrush(Colors.Black); 
      int x = locale.x; 
      int y = locale.y; 
      halfSize = 10; 
      DrawEllipse(locale.Name, sensorBrush, sensorOutline, x - halfSize, y - halfSize, 2 * halfSize, 2 * halfSize); 
     } 

     public void DrawEllipse(string name, Brush sensorBrush, Brush sensorPen, int x, int y, int width, int height) 
     { 
      double thickness = 5; 

      Ellipse ellipse = new Ellipse(); 
      /* 
      Define ellipse 
      */ 
      canvas.Children.Add(ellipse); 
     } 
    } 
} 

최종 canvas.Children 라인 주위에 오류를 던졌습니다 내 첫 번째 시도였다, 즉 나는에 DrawEllipse 이동 시도

'이름'캔버스 '는 현재 컨텍스트에 존재하지 않습니다 " 다른 오류

를 던졌습니다 여기에 별도의 클래스,
namespace ZoomPan 
{ 
    public class DisplayManager 
    { 
     protected void DrawIcon(Locale locale, Color color) 
     { 
      Brush sensorBrush = new SolidColorBrush(color); 
      Brush sensorOutline = new SolidColorBrush(Colors.Black); 
      int x = locale.x; 
      int y = locale.y; 
      halfSize = 10; 
      DrawEllipse(locale.Name, sensorBrush, sensorOutline, x - halfSize, y - halfSize, 2 * halfSize, 2 * halfSize); 
     } 
    } 

    public class MainWindow : Window 
    { 
     public void DrawEllipse(string name, Brush sensorBrush, Brush sensorPen, int x, int y, int width, int height) 
     { 
      double thickness = 5; 

      Ellipse ellipse = new Ellipse(); 
      /* 
      Define ellipse 
      */ 
      canvas.Children.Add(ellipse); 
     } 
    } 
} 

이러한 오류는 첫 번째 클래스의 DrawEllipse 호출 주위 :

'이름'DrawEllips e '는 현재 컨텍스트에 존재하지 않습니다. "

그리고 MainWindow를 추가 할 때. DrawEllipse :

"비 정적 필드, 메서드 또는 속성에 대해 개체 참조가 필요합니다. 'ZoomPan.MainWindow.DrawEllipse (string, System.Windows.Media.Brush, System.Windows.Media.Brush,

처음으로 WPF로 놀았을 때 DrawEllipse 메서드가 Public 클래스 MainWindow에있을 때 캔버스에 표시 할 수있었습니다 : MainWindow.xaml.cs의 Window 파일, 따라서 위의 두 번째 시도.

나는 뭔가 명백한 것을 놓치고 사이트에서이 질문에 대한 정확한 속임수를 찾을 수 없다고 느낍니다.

+0

근본적인 문제는 WPF, XAML 또는 내가 공유 한 세부 정보와 관련이 없습니다. 이것은 C# 언어 (또는 일반적으로 객체 지향 프로그래밍)를 이해하는 문제입니다. 당신이 참조하려고하는'canvas' 필드는'MainWindow' 객체에 속하며 여러분이 전역 변수의 일종 인 것처럼 접근하려고합니다. – adv12

+0

@ adv12 내가 설명 할 필요가 없다고 생각한다. 나는 동시에 C#을 배우려고 노력하고있다! 이것이 바로 두 번째 DrawEllipse가 작동하는 이유입니다. 그 MainWindow 개체 내에서? MainWindow 경계 밖에서이 메서드를 호출하는 방법이 있습니까? – alzinos

+0

예,'DrawEllipse'는'MainWindow'가'canvas'라는 필드를 가지고 있기 때문에'MainWindow' 클래스의 메소드로 작동합니다. 다른 클래스의'Canvas' 객체에 액세스하려면 다른 클래스에 참조를 주어야합니다 (생성자에서 전달하거나'Canvas' 객체를 가져 와서 저장하는'SetCanvas'라는 메서드를 만들면됩니다). 민간 필드로서. 빠르고 더러운 그러나 틀린 해결책은'canvas' 필드를'MainWindow'에서 공개하고'MainWindow'의 인스턴스를 통해 접근하는 것입니다. – adv12

답변

0

다른 클래스는 canvas 객체를 전달해야 사용할 수 있습니다.

public class DisplayManager 
{ 
    Canvas canvas; 
    public DisplayManager(Canvas canvas) 
    { 
     this.canvas = canvas; 
    } 
} 

또는 제 1 파라미터로서 각각의 방법으로마다 전달할 :

가 기억하고있는 모든 방법에 사용될 수 있도록

어느 일단 생성자를 통해의 Display 캔버스 합격

public class DisplayManager 
{ 
    public void DrawEllipse(Canvas canvas, string name, Brush sensorBrush, Brush sensorPen, int x, int y, int width, int height) 
    { 
    } 
} 
+0

가장 먼저 작동하는 것, DisplayManager displayManager = xaml을 초기화 한 후 새로운 DisplayManager (캔버스)를 추가하고 displayManager.DrawIcon을 제대로 실행 했으므로 이제는 double을 다른 오류로 수정했습니다. 감사합니다! – alzinos

관련 문제