2

我正在尝试在AutoCompleteBox我的一个屏幕上访问。当我这样做时,我可以看到它FindControl()已经找到了控件var testControl = FindControl("MyControl");

但是,当我尝试将其转换为它应该是的控件类型以便我可以操纵它时,结果是null.

这就是我正在做的事情:

System.Windows.Controls.AutoCompleteBox testBox = new System.Windows.Controls.AutoCompleteBox();
testBox = testControl as System.Windows.Controls.AutoCompleteBox;

testBox将为空。

它肯定说控件AutoCompleteBox在屏幕上,我不确定我做错了什么。任何人都可以帮忙吗?

编辑:感谢 Yann,我能够使用以下代码解决此问题:

this.FindControl("MyControl").ControlAvailable += (p, e) =>
        {
            //For every  use I can just cast like ((System.Windows.Controls.AutoCompleteBox)e.Control)
        };
4

2 回答 2

1

如果as返回 null,则您试图转换为错误的类型。换句话说,testControl不是类型AutoCompleteBox

在第二行放一个断点,看看testControl运行时真正的类型是什么。

于 2012-10-25T11:54:20.153 回答
1

正如您所发现的,您从中获得的对象FindControl只是一个代理对象。获得真正控制的方法分两步完成:

  1. 将代码添加到screenCreated方法中(在 screen 的方法运行之前,控件不保证可用Created)。
  2. 然后将处理程序添加到代理的ControlAvailable方法。
Private Sub ScreensName_Created

      FindControl("ControlsName"). AddressOf ControlsName_ControlAvailable

End Sub

Private Sub ControlsName_ControlAvailable(sender as Object, e as ControlAvailableEventArgs)

    'do whatever you want in here
    'you can cast e.Control to whatever is the type of the underlying Silverlight control.

End Sub

当然,您需要将“ScreensName”和“ControlsName”替换为您自己的名称。

(由于某种原因,我无法成功地将两种方法的整个文本格式化为代码)

于 2012-10-26T05:30:08.400 回答