如果我理解正确的话,您是说当控件滚动出应用程序的视口时,即使其可见属性仍为true,FrameworkElement.FindName("")也无法找到它。
我假设您已经掌握了有关Xaml作用域的所有基础知识等。如果您正在动态添加控件,您确定您正在从正确的父元素等遍历吗?如果是这样:
使用RedGate的反射器,我们可以看到FrameWorkElement.FindName的实现如下:
public object FindName(string name)
{
return XcpImports.DependencyObject_FindName(this, name);
}
XcpImports.DependencyObject_FindName被实现为:
[SecuritySafeCritical]
internal static DependencyObject DependencyObject_FindName(DependencyObject referenceDO, string name)
{
int num;
IntPtr ptr;
CheckThread();
if (name == null)
{
throw new ArgumentNullException("name");
}
uint hr = FindNameNative(JoltHelper.Context, (uint) name.Length, name, referenceDO.NativeObject, out num, out ptr);
GC.KeepAlive(referenceDO);
if ((hr != 0) && (hr != 0x80004005))
{
throw Error.MarshalXresultAsException(hr);
}
return (DependencyObject) ConvertDO(ptr, num, true);
}
因此,除非你遇到异常情况,否则我认为最有趣的一行代码可能是:
uint hr = FindNameNative(JoltHelper.Context, (uint) name.Length, name, referenceDO.NativeObject, out num, out ptr);
这是通过进入本地代码并在XcpImports中定义导入dll实现的:
[DllImport("agcore", EntryPoint="FindName", CharSet=CharSet.Unicode)]
private static extern uint FindNameNative(IntPtr context, uint cString, [MarshalAs(UnmanagedType.LPWStr)] string name, IntPtr referenceObject, out int typeIndex, out IntPtr obj);
不要与Developer Express的AgCore混淆。
这是Ed Burnette在ZdNet上发表的文章(约2007年)。
http://www.zdnet.com/blog/burnette/dissecting-silverlight/297
说的是:
agcore.dll(已安装2.2M)- 这是核心ActiveX控件,负责Silverlight的渲染和事件,包括音频和视频解码。
它还在下面说:
npctrl.dll(460K)- agcore.dll的包装器,使其在Firefox内运行。
所以我的第一个问题是:您的问题在每个浏览器中都一致吗?也许是某个浏览器/版本中的agcore.dll包装器有问题,而不是核心技术(agcore.dll)本身。