2011-01-07 73 views
2

我正在制作一个项目,在Visual Studio上用C#创建整个项目(包括模板)。为什么我无法从我的事件处理程序中访问变量?

我已经制作了模板并刚刚开始在事件上工作,我想为创建的Canvas创建一个事件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); 
      } 
     } 
    } 

我试图做down1 = e.GetPosition(canvas1);但我对(canvas1)得到一个错误;

我做了一个类似的项目,而无需编写代码模板,用没有任何问题“的名字canvas1不会在当前的背景下存在” ..

回答

0

你宣布canvas1作为Grid1_Loaded方法中的局部变量。在类中定义它作为成员变量,它应该工作。

+0

神奇。令人惊讶的是我为这些事情而堕落。谢谢! – joao

0

如何:

down1 = e.GetPosition((Canvas)sender); 
0

的问题是canvas1是Grid1_Loaded一个局部变量。在该方法之外无法访问该变量。

+0

Doh - 不太快。 – RQDQ

0

问题是canvas1不在范围内。你可以内嵌一个简单的lambda表达式是这样的:

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

但我对(canvas1)得到一个错误;

这是因为canvas1是另一种方法的局部变量,不能在canvas1_MouseLeftButtonDown()内部访问。

您可以使用:

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

我会在'as'上使用一个强制转换,这样可以避免相当烦人的'NullReferenceException'。 – ChaosPandion

+0

@Chaos:只是为了交易一个'InvalidCastException'?我认为这不重要,我觉得'更容易阅读。 –

+2

我更喜欢'InvalidCastException'因为它给了你更多的信息。以防万一某人重复使用相同的处理程序进行其他控制。 *(我知道这个具体的例子并不重要,但我仍然认为这是一个好习惯。)* – ChaosPandion

相关问题