我在运行时使用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之后但我不能事先做到。
答案 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
我突出了重点。