访问在运行时创建的控件(WPF)

时间:2014-11-17 08:17:34

标签: wpf vb.net access-control

我在运行时使用vb.net创建了一个Textblock控件,但我还需要能够在整个应用程序的不同时间编辑它的属性,如颜色和字体。

这是我创建控件的程序。

Public Sub New()


    InitializeComponent()


        Dim TextBlockPlayerName As New TextBlock

        TextBlockPlayerName.Name = "TextBlockPlayerName"
        TextBlockPlayerName.Text = "Some text"

        Grid.SetRow(TextBlockPlayerName, 1)
        Grid.SetColumn(TextBlockPlayerName, 2)

        GridVotes.Children.Add(TextBlockPlayerName)

End Sub

代码正常工作,文本块正确显示,但是当我尝试在整个程序的其余部分对控件执行任何操作时,我会收到错误。

我尝试过使用

FindName("TextBlockPlayerName")

GridVotes.FindName("TextBlockPlayerName")

但是我总是得到System.NullReferenceException异常,说''对象引用未设置为对象的实例'当我尝试像这样简单地访问它时

Dim PlayerName As TextBlock = FindName("TextBlockPlayerName")

MessageBox.Show(PlayerName.Name)

如果我对我在“设计”视图中创建的控件执行此操作,那么一切正常,但如果我使用代码创建它则不行。 不确定它是否与“新”中的事实有关。 Sub和InitialzeComponent之后但我不能事先做到。

1 个答案:

答案 0 :(得分:0)

在设计器中创建的控件将添加到您创建它的窗口/用户控件/模板的namescope中。

当您在代码中添加控件时,添加到此范围。为什么不?查看相对昂贵。通过在代码中创建它,无论如何都可以获得对新控件的引用。预计您将在需要时保留参考。

在namecope上有msdn文档可以帮助您实现所需:

  

将对象添加到运行时对象树

     

解析XAML的那一刻表示创建和定义WPF XAML名称范围的时刻。如果您将对象添加到   在生成该树的XAML之后的某个时间点的对象树   解析后,新对象上的Name或x:Name值不会   自动更新XAML名称范围中的信息。添加一个   加载XAML后,对象的名称为WPF XAML名称范围,   必须在对象上调用RegisterName的相应实现   定义XAML名称范围,通常是XAML页面   根即可。如果未注册名称,则添加的对象不能   通过FindName之类的方法引用名称,但您不能   使用该名称进行动画定位。

     

http://msdn.microsoft.com/en-us/library/ms746659%28v=vs.110%29.aspx

我突出了重点。