2014-12-17 4 views
1

Как получить значение от детей отправителя?Получить контент для контроля содержания от отправителя

MouseUp на Canvas создает Grid.

private void ScrollViewer_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     Grid grid = new Grid(); 

     Label timeLabel = new Label(); 
      timeLabel.Content = "06:00"; //this could be anything 
      timeLabel.Name = "TimeStart" 

      grid.Children.Add(timeLabel); 
      canvas.Children.Add(grid); 
       grid.MouseDown += new MouseButtonEventHandler(ClickEvent); 
    } 

Когда пользователь нажимает на уже существующий Grid, я хочу MessageBox содержащий timeLabel.Content появляться, в данном случае, «6:00»

Это не работает (я пробовал некоторые другие а также, такой же результат)

void ClickEvent(object sender, RoutedEventArgs e) 
    { 
     Grid test = (Grid)sender; 
     Label label = (Label)test.FindName("TimeStart"); 
     MessageBox.Show(label.Content.ToString()); 
    } 

Ошибка

An unhandled exception of type 'System.NullReferenceException' occurred in MissionControl M.exe 

     Additional information: Object reference not set to an instance of an object. 
+0

Вы уверены, что счётчик сетки = (сетка); не возвращает null? i.e отправитель не является сеткой – ZSH

ответ

2

вы можете использовать Registername для контроля этикеток и дать имя, а затем получить доступ к нему с помощью FindName

private void ScrollViewer_MouseUp(object sender, MouseButtonEventArgs e) 
     { 
      NameScope.SetNameScope(grid, new NameScope()); 
      Label timeLabel = new Label(); 
      timeLabel.Name = "label1"; 
      grid.RegisterName("label1", timeLabel); 
      timeLabel.Content = "06:00";     
     } 
     void ClickEvent(object sender, RoutedEventArgs e) 
     { 
      Grid test = (Grid)sender; 
      if (test != null) 
      { 
       Label label = (Label)test.FindName("label1"); 
       MessageBox.Show(label.Content.ToString()); 
      } 
    } 
+0

Редактирование исправлено! :) спасибо – HPaulson

1

Вы назвали свою сетку, но вы пытаетесь найти свой лейбл по имени. Выберите тот или другой. Наверное, наименование вашей метки вместо вашей сетки имеет наибольший смысл.

+0

ой, я переписал код на StackOverflow и пропустил эту часть, конечно, я назвал Label not the Grid. :) – HPaulson

0

вы должны назвать вас Контрактными, а затем FindName

или вы можете использовать затем первую сетку детей:

Grid test = (Grid)sender; 
if(test != null) 
{ 
     Label label = test.Children[0] as Lable; 
     MessageBox.Show(label.Content.ToString()); 
} 
Смежные вопросы