如果我正确理解你的意思,你说当一个控件滚出应用程序的ViewPort时,即使它的可见属性保持为真,FrameworkElement.FindName(“”)也找不到它。
我想你已经通过所有的基础工作重新:XAML中划定范围等,如果您要添加控件动态你确定你从如果是正确的父元素等走:
使用RedGates反射器我们可以看到如下的是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相混淆。
本文就ZDNET(大约2007年)由Ed伯内特:
http://www.zdnet.com/blog/burnette/dissecting-silverlight/297
说的是:
agcore.dll(安装2.2M) - 这是核心ActiveX控件是 负责Silverlight渲染和事件,包括音频和视频解码。
它还说低于指出:
npctrl.dll(460K) - 一种用于agcore包装。这使得它运行在Firefox内部 。
所以我的第一个问题是。你的问题在每个浏览器中是否一致? 也许它是在某些浏览器/版本中是agcore.dll的包装问题,而不是核心技术(agcore.dll)本身。
是您的虚拟化容器的命名控件? – Denis
包含我正在查找的控件的控件是一个ListBox。我相信我只是发现默认情况下,UI虚拟化对于ListBox而言是有效的,这很可能是问题所在。如何关闭特定控件的UI虚拟化? 要在ListBox控件本身上尝试VirtualizingStackPanel.VirtualizationMode =“Standard”。将回报。 –