2011-01-07 6 views
2

저는 Visual Studio에서 C#으로 전체 프로젝트 (템플릿 포함)를 만드는 프로젝트를 만들고 있습니다.내 이벤트 핸들러에서 변수에 액세스 할 수없는 이유는 무엇입니까?

템플릿을 만들고 방금 이벤트에 대한 작업을 시작했습니다. 만든 캔버스에 대한 이벤트 MouseLeftButtonDown을 만들고 싶습니다.이 이벤트는 마우스 위치를 기록합니다.

내 코드입니다 :

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

     private char tester; 
     private Point down1; 
     private Point up1; 

     private void Grid1_Loaded(object sender, RoutedEventArgs e) 
     { 
      RowDefinition row1 = new RowDefinition(); 
      RowDefinition row2 = new RowDefinition(); 

      row1.Height = new GridLength(40); 
      row2.Height = new GridLength(1, GridUnitType.Star); 

      Grid1.RowDefinitions.Add(row1); 
      Grid1.RowDefinitions.Add(row2); 

      Canvas canvas1 = new Canvas(); 
      canvas1.Background = new SolidColorBrush(Colors.Beige); 
      Grid.SetRow(canvas1, 1); 
      Grid1.Children.Add(canvas1); 
      canvas1.MouseLeftButtonDown += new RoutedEventHandler(canvas1_MouseLeftButtonDown); 
      canvas1.MouseLeftButtonUp += new RoutedEventHandler(canvas1_MouseLeftButtonUp); 


      Button btnRect = new Button(); 
      btnRect.Content = "Rectangulo"; 
      btnRect.Margin = new Thickness(5, 5, 5, 5); 
      btnRect.HorizontalAlignment = HorizontalAlignment.Left; 
      btnRect.VerticalAlignment = VerticalAlignment.Center; 
      Grid.SetRow(btnRect, 0); 
      Grid1.Children.Add(btnRect); 
      //btnRect.Click += new RoutedEventHandler(btnRect_Click); 

      Button btnEllip = new Button(); 
      btnEllip.Content = "Ellipse"; 
      btnEllip.Margin = new Thickness(75, 5, 5, 5); 
      btnEllip.HorizontalAlignment = HorizontalAlignment.Left; 
      btnEllip.VerticalAlignment = VerticalAlignment.Center; 
      Grid.SetRow(btnEllip, 0); 
      Grid1.Children.Add(btnEllip); 
      //btnEllip.Click += new RoutedEventHandler(btnEllip_Click); 

     } 

그리고 이것은 내 이벤트입니다 :

private void canvas1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
      { 
       down1 = e.GetPosition(canvas1); 
      } 
     } 
    } 

내가하지만 난 (canvas1)에 오류를 받고 있어요 down1 = e.GetPosition(canvas1);을 시도했다; .. 나는 아무런 문제, 템플릿을 코딩 할 필요없이 유사한 프로젝트를했습니다

답변

0

을 "이름의 canvas1이 현재 컨텍스트에 존재하지 않는"당신은 Grid1_Loaded 방법 내부의 지역 변수로 canvas1 선언 . 대신 멤버 변수로 클래스에 정의하면 제대로 작동합니다. 에 대해 어떻게

+0

환상적인. 내가이 일들에 어떻게 빠져 있는지 놀랍다. 고맙습니다! – joao

0

문제는 canvas1이다는 Grid1_Loaded에서 지역 변수입니다. 해당 메소드 외부에서 해당 변수에 액세스 할 수있는 방법이 없습니다.

+0

Doh - 그렇게 빠르지는 않습니다. – RQDQ

0

문제는 canvas1이 범위에 포함되지 않는다는 것입니다. 이 같은 간단한 람다 식 인라인 수 :

canvas1.MouseLeftButtonDown += (sender, e) => down1 = e.GetPosition(canvas1); 
1

을하지만 난 (canvas1)에 오류를 받고 있어요; canvas1_MouseLeftButtonDown()canvas1는 내부에 액세스 할 수없는 다른 방법의 로컬 변수이기 때문에

된다.

당신은 사용할 수 있습니다

Canvas c = sender as Canvas; // or Canvas c = (Canvas) sender; 
down1 = e.GetPosition(c); 
+0

''as'를 통한 캐스트를 사용하므로 귀찮은'NullReferenceException'을 피할 수 있습니다. – ChaosPandion

+0

@Chaos :'InvalidCastException'을 위해 그것을 트레이드하려고합니까? 나는 여기서 그다지 중요하지 않다고 생각한다. –

+2

나는 조금 더 많은 정보를 제공하기 때문에'InvalidCastException'을 선호한다. 누군가가 다른 컨트롤을 위해 동일한 핸들러를 재사용 할 경우를 대비해. * (나는이 특별한 예를 많이 알지도 모르지만 여전히 좋은 습관이라고 생각한다.) * – ChaosPandion

관련 문제