Silverlight: FrameworkElement.FindName () не находит элемент управления, когда он не «виден» в окне браузера - PullRequest
4 голосов
/ 06 октября 2011

У меня возникла проблема, когда я использую метод FindName () объекта FrameworkElement для поиска дочернего элемента управления этого элемента.

Есть несколько интересных действий, которые язаметил и не могу понять,Если пользователь прокручивает окно браузера так, что сам элемент управления визуально больше не отображается в контексте оконной рамки, то «FindName ()» не возвращает элемент.Однако, если этот элемент управления виден в рамке окна, он находит его в порядке.

Это известная проблема?Кто-нибудь еще сталкивался с этим раньше?

Я также не говорю о свойстве Visibility элемента управления.Свойству Visibility присвоено значение Visible.

Обновление Я попытался установить VirtualizingStackPanel.VirtualizationMode = "Standard" в элементе управления ListBox (который является контейнером, который я ищу), и он все еще делалне найден указанный элемент управления.

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Если я правильно вас понимаю, вы говорите, что когда элемент управления прокручивается из ViewPort приложения, тогда, даже если его свойство visible остается истинным, 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);

Который выходит в собственный код и определяется через импорт DLL в XcpImports:

[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);

Не следует путать с AgCore для разработчиков Express.

Эта статья на 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).

2 голосов
/ 06 октября 2011

Если вы используете такой инструмент, как Silverlight Spy , вы можете попытаться найти элемент управления вручную.

Если его там нет, то, вероятно, в виртуализированной стековой панели .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...