如果我理解正确,您是说当控件滚动出应用程序的 ViewPort 时,即使它的可见属性保持为 true,FrameworkElement.FindName("") 也无法找到它。
我假设您已经完成了所有基础知识:Xaml 范围界定等。如果您动态添加控件,您确定您正在从正确的父元素等开始。如果是这样:
使用RedGates Reflector我们可以看到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);
不要与 Developers Express 的 AgCore 混淆。
Ed Burnette 撰写的关于 ZdNet 的文章(大约 2007 年):
http://www.zdnet.com/blog/burnette/dissecting-silverlight/297 http://www.zdnet.com/blog/burnette/dissecting-silverlight/297
说:
agcore.dll(已安装 2.2M)- 这是核心 ActiveX 控件
负责Silverlight渲染和事件,包括音频和
视频解码。
它还在下面说:
npctrl.dll (460K) - agcore.dll 的包装器,使其在内部运行
火狐。
所以我的第一个问题是。您的问题在每个浏览器中都一致吗?
也许问题在于某些浏览器/版本中 agcore.dll 的包装器,而不是核心技术 (agcore.dll) 本身。