我试图在我的一个屏幕上访问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)
        };

最佳答案

正如您所发现的,从FindControl获取的对象仅仅是一个代理对象。获得真正控制权的方法分两个步骤:


将代码添加到屏幕的Created方法(在屏幕的Created方法运行之前,不能保证控件可用)。
然后将处理程序添加到代理的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”。

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

关于c# - LightSwitch-使用FindControl获取AutoCompleteBox,在转换时为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13067864/

10-09 05:49