从发件人获取子控件内容

本文关键字:控件 获取 | 更新日期: 2023-09-27 18:34:25

如何从发件人的子级获取值?

Canvas上的MouseUp会创建一个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时,我希望出现包含timeLabel.ContentMessageBox,在本例中为"06: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.

从发件人获取子控件内容

您可以将 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());
            }
    }

您为网格命名,但您尝试按名称查找标签。选择一个或另一个。也许,命名标签而不是网格最有意义。

你应该命名为标签,然后命名为FindName

或者你可以使用然后第一个网格子:

Grid test = (Grid)sender;
if(test != null)
{
      Label label = test.Children[0] as Lable;
      MessageBox.Show(label.Content.ToString());
}