gpt4 book ai didi

wpf - Silverlight:FrameworkElement.FindName() 在浏览器窗口中不是 "visible"时找不到控件

转载 作者:行者123 更新时间:2023-12-04 22:21:46 26 4
gpt4 key购买 nike

我遇到了一个问题,我使用 FrameworkElement 对象的“FindName()”方法来搜索该元素的子控件。

我注意到了一些有趣的行为,但似乎无法弄清楚。
如果用户滚动浏览器窗口以便控件本身不再在窗口框架的上下文中可见,则“FindName()”不会返回该元素。
但是,如果该控件在窗口框架内可见,它就会发现它很好。

这是一个已知的问题?有没有其他人遇到过这个问题?

我也不是在谈论控件的 Visibility 属性。可见性属性设置为可见。

更新
我试图在 ListBox 控件(我正在搜索的容器)上设置 VirtualizingStackPanel.VirtualizationMode="Standard",但它仍然没有找到指定的控件。

最佳答案

如果我理解正确,您是说当控件从应用程序的 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);

这是进入 native 代码并通过 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 Burnette 撰写:

http://www.zdnet.com/blog/burnette/dissecting-silverlight/297

说:

agcore.dll (2.2M installed) - This is the core ActiveX control that is responsible for Silverlight rendering and events, including audio and video decoding.



它还在下面说:

npctrl.dll (460K) - A wrapper for agcore.dll that makes it run inside Firefox.



所以我的第一个问题是。您的问题在每个浏览器中都一致吗?
也许它是某些浏览器/版本中 agcore.dll 的包装器,这才是问题所在,而不是核心技术 (agcore.dll) 本身。

关于wpf - Silverlight:FrameworkElement.FindName() 在浏览器窗口中不是 "visible"时找不到控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7667392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com