ContentControl no está visible cuando la aplicación se inicia a través de la prueba de UI Automation, pero está visible cuando la aplicación se inicia por usuario

Estamos utilizando el prisma y WPF para construir la aplicación. Recientemente, comenzamos a usar UI Automation (UIA) para probar nuestra aplicación. Pero algo extraño ocurrió cuando ejecutamos la prueba UIA. Aquí está la cáscara simplificada:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>    
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <TextBlock 
        Grid.Row="0" Grid.Column="0"
        Name="loadingProgressText"
        VerticalAlignment="Center" HorizontalAlignment="Center"
        Text="Loading, please wait..."/>

    <Border
        Grid.Row="0" 
        x:Name="MainViewArea">
        <Grid>
            ...
        </Grid>
    </Border>

    <!-- Popup -->
    <ContentControl 
        x:Name="PopupContentControl"
        Grid.Row="0" 
        prism:RegionManager.RegionName="PopupRegion"
        Focusable="False">
    </ContentControl>

    <!-- ErrorPopup -->
    <ContentControl 
        x:Name="ErrorContentControl"
        Grid.Row="0" 
        prism:RegionManager.RegionName="ErrorRegion"
        Focusable="False">
    </ContentControl>
</Grid>

En nuestra aplicación, usamos capas (Popup yErrorPopup) esconderMainViewArea, para denegar el acceso a los controles. MostrarPopup, utilizamos el siguiente método:

    //In constructor of current ViewModel we store _popupRegion instance to the local variable:
    _popupRegion = _regionManager.Regions["PopupRegion"];
    //---

    private readonly Stack<UserControl> _popups = new Stack<UserControl>();
    public void ShowPopup(UserControl popup)
    {
        _popups.Push(popup);

        _popupRegion.Add(PopupView);
        _popupRegion.Activate(PopupView);
    }

    public UserControl PopupView
    {
        get
        {
            if (_popups.Any())
                return _popups.Peek();
            return null;
        }
    }

Similar a esto, mostramosErrorPopup Sobre todos los elementos de nuestra aplicación:

    // In constructor we store _errorRegion:
    _errorRegion = _regionManager.Regions["ErrorRegion"]
    // --- 

    private UserControl _error_popup;

    public void ShowError(UserControl popup)
    {
        if (_error_popup == null)
        {
            _error_popup = popup;
            _errorRegion.Add(_error_popup);
            _errorRegion.Activate(_error_popup);
        }
    }

Mística ...

Cuando lo ejecutamos como lo hacen los usuarios (haga doble clic en el icono de la aplicación), podemos ver ambos controles personalizados (usandoAutomationElement.FindFirst método, oa través deVerificación automática de la interfaz de usuario). Pero cuando lo iniciamos usando la prueba de automatización de la interfaz de usuario -ErrorPopup Desaparece del árbol de los mandos. Intentamos iniciar la aplicación así:

System.Diagnostics.Process.Start(pathToExeFile);

Creo que nos hemos perdido algo. ¿Pero que?

Editar # 1

Como dijo @chrismead, intentamos ejecutar nuestra aplicación conUseShellExecute flag establecido en true, pero esto no ayuda. Pero si empezamos la aplicación desdecmd línea, y manualmente haga clic en el botón,Popup yErrorPopup Son visibles en el árbol de controles de automatización.

    Thread appThread = new Thread(delegate()
        {
            _userAppProcess = new Process();
            _userAppProcess.StartInfo.FileName = pathToExeFile;
            _userAppProcess.StartInfo.WorkingDirectory = System.IO.Directory.GetCurrentDirectory();
            _userAppProcess.StartInfo.UseShellExecute = true;
            _userAppProcess.Start();

        });
        appThread.SetApartmentState(ApartmentState.STA);
        appThread.Start();

Una de nuestras sugerencias es cuando usamos el método.FindAll oFindFirst para buscar el botón para hacer clic, la ventana guardó de alguna manera su estado de automatización de la interfaz de usuario y no lo actualiza.

Editar # 2 Hemos encontrado, ese método de extensión de la biblioteca de prisma.IRegionManager.RegisterViewWithRegion(RegionNames.OurRegion, typeof(Views.OurView)) Tener algún comportamiento extraño. Si dejamos de usarlo, esto resuelve nuestro problema particularmente. Ahora podemos ver ErrorView y cualquier tipo de vista enPopupContentControl, y la aplicación actualiza la estructura de árbol de elementos UIA. Pero esto no es una respuesta: "¡Deja de usar esta función"!

EnMainViewArea tenemos unaContentControl, que actualiza el contenido en función de las acciones del usuario y solo podemos ver los primeros archivos cargados.UserControl a eseContentControl.Content propiedad. Esto se realiza así:

IRegionManager regionManager = Container.Resolve<IRegionManager>();
regionManager.RequestNavigate(RegionNames.MainContentRegion, this.Uri);

Y si cambiamos la vista, no se realizarán actualizaciones en el árbol de automatización de la interfaz de usuario; en su lugar, la primera vista cargada estará en ella. Pero visualmente observamos otra.ViewyWPFInspector lo muestra correctamente (no se trata de un árbol de automatización de la interfaz de usuario), pero Inspect.exe, no.

También nuestra sugerencia de que la ventana use algún tipo de almacenamiento en caché es incorrecta: el almacenamiento en caché en el cliente de UI Automation tenemos que activar explícitamente, pero no lo hacemos.

Respuestas a la pregunta(3)

Su respuesta a la pregunta