我遇到了一个问题,我正在使用FrameworkElement对象的“FindName()”方法来搜索该元素的子控件。
我注意到了一些有趣的行为,似乎无法弄明白。 如果用户滚动浏览器窗口以便在窗口框架的上下文中不再显示控件本身,则“FindName()”不返回该元素。 但是,如果该控件在窗口框架中可见,则会发现它很好。
这是一个已知问题吗?还有其他人遇到过此吗?
我也不是在讨论控件的Visibility属性。 Visibility属性设置为Visible。
更新 我试图在ListBox控件(我正在搜索的容器)上设置VirtualizingStackPanel.VirtualizationMode =“Standard”,但仍然没有找到指定的控件。
答案 0 :(得分:3)
如果我理解正确你说当控件滚出应用程序的ViewPort然后即使它的可见属性仍然是真的,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
说:
agcore.dll(已安装2.2M) - 这是核心ActiveX控件 负责Silverlight渲染和事件,包括音频和 视频解码。
下面还说:
npctrl.dll(460K) - 一个让它在里面运行的agcore.dll包装器 Firefox浏览器。
所以我的第一个问题是。您的问题在每个浏览器中是否一致? 也许它是某些浏览器/版本中的agcore.dll的包装,这是问题,而不是核心技术(agcore.dll)本身。
答案 1 :(得分:2)
如果您使用Silverlight Spy这样的工具,您可以尝试手动找到控件。
如果不存在,则可能在a virtualizing stackpanel。