none
Load de un DomainDataSource con un Thread - Silverlight RRS feed

  • Pregunta

  • Siguiendo la solución que dio David_González<abbr class="affil"></abbr> a una pregunta del foro: http://social.msdn.microsoft.com/Forums/es-ES/4f66a7af-ec2e-4994-ac37-93a69671ef9d/aplicacion-en-waiting?forum=wpfes traté de adaptarla a una necesidad que tengo en mi aplicación pero no funciona como espero.

    El detalle es que en el XAML de mi ChildWindow, tengo declarados varios controles, combos, datagrids, textbox, etc. los cuales tienen enlazados datos, todos ellos contienen poca información, salvo un ComboBox que contiene todos los productos registrados que son insumos, herramientas, consumibles, que son muchos, así que al cargar ese combo se tarda un buen rato (1 ó 1.5 minutos), y mientras el usuario no puede (ni debe) interactuar con la aplicación.

    Agregué una animación de espera, para que el usuario supiera que se estaba procesando información y hasta que terminara podía trabajar, pero la animación se congela hasta que se carga el combo, así que no me está sirviendo para el fin que quiero.

    Originalmente el riaControls:DomainDataSource que alimenta el combo de productos lo tenía declarado como AutoLoad=True así que se cargaba junto con todos los demás controles, incluyendo la animación desde el InitializeComponent(); pero entonces la carga y la animación se "estorban"

            <riaControls:DomainDataSource x:Name="pRODUCTOSDomainDataSource" AutoLoad="True" 
    			LoadedData="pRODUCTOSDomainDataSource_LoadedData"                                       
    			QueryName="GetPRODUCTOSQuery" d:DesignData="{d:DesignInstance Web:PRODUCTOS, CreateList=true}" Margin="254,204,253,28">
                <riaControls:DomainDataSource.DomainContext>
                    <Web:DomainServiceMTTO/>
                </riaControls:DomainDataSource.DomainContext>
                <riaControls:DomainDataSource.FilterDescriptors>
                    <riaControls:FilterDescriptor Operator="Contains"
                                                  PropertyPath="DESPROD"
                                                  Value="{Binding ElementName=txtFilter, Path=Text}" />
                </riaControls:DomainDataSource.FilterDescriptors>
            </riaControls:DomainDataSource>
            <ComboBox x:Name="cbIDPROD" Height="23" HorizontalAlignment="Left" VerticalAlignment="Top"
                        DisplayMemberPath="IDPROD"
                        ItemsSource="{Binding Data, ElementName=pRODUCTOSDomainDataSource}" 
                        Margin="68,122,0,0" 
                        SelectedValuePath="IDPROD" SelectionChanged="cbpRODUCTOS_SelectionChanged" Width="85"
                      IsEnabled="{Binding CanLoad, Converter={StaticResource IsNotConverter}, ElementName=mtto_RefaccionTipoMantenimientoDomainDataSource}">
                <ComboBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel/>
                    </ItemsPanelTemplate>
                </ComboBox.ItemsPanel>
            </ComboBox>

    La animación se iniciaba al hacer el Load de la imagen:

            private void imgEspera_Loaded(object sender, RoutedEventArgs e)
            {
                StoryboardEspera.Begin();
            }

    Pero siguiendo la idea de la pregunta que comenté al principio, hice los siguientes cambios:

    En el XAML, puse AutoLoad=False

    Y en .cs:

            /// <summary>
            /// Se pueden hacer Altas y Cambios a los Kit de Refacciones
            /// </summary>
            public frmRefaccionTipoMantenimiento()
            {
                InitializeComponent();
    
                imgEspera.Visibility = Visibility.Visible;
                StoryboardEspera.Begin();
                this.Opacity = 0.8;
    
                CargaProductos();
    
            }
    
            private void CargaProductos()
            {
                try
                {
    
                    new System.Threading.Thread(delegate()
                    {
                        pRODUCTOSDomainDataSource.Load();
    
                        // una vez terminado el proceso, se invoka asincronamente al hilo principal
                        // con el cuerpo de uno de estos delegados para modificar el control de interface grafica
    
                        imgEspera.Dispatcher.BeginInvoke((ThreadStart)delegate
                        {
                            StoryboardEspera.Stop();
                            imgEspera.Visibility = Visibility.Collapsed;
                            this.Opacity = 1;
    
                        });
    
                    }).Start();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }        
    
            }

    Pero en este caso, me marca error en la linea en negritas, que es donde le digo que cargue el DomainDataSource de los productos: "Acceso entre procesos no válido"

    Así que intenté cambiando esa parte para que quedara así:

    pRODUCTOSDomainDataSource.Dispatcher.BeginInvoke((ThreadStart)delegate
    {
    pRODUCTOSDomainDataSource.Load();
    });

    Así no marca error, pero no muestra la animación y se inactiva la pantalla hasta que termina de cargar el combo

    Total, que estoy perdida, quizá cargando por páginas el combo...alguien me puede orientar?

     


    cyndyrdz


    lunes, 15 de septiembre de 2014 18:13

Todas las respuestas

  • Una opción que encuentro es definir el LoadSize=50 en el DomainDataSource:

    <riaControls:DomainDataSource x:Name="pRODUCTOSDomainDataSource" AutoLoad="True" LoadSize="50"
    Así no se tarda en hacer el InitializeComponent(); pues me muestra los primeros 50 productos, y conforme el usuario "scrollea" en el combo va presentando los demás productos, el único pero, es que en un grid abajo pongo los productos que ya están registrados para el Kit de refacciones, y en el combo me posiciono sobre el primer producto del Kit (que está en el grid), y si el producto es el 2456, pues en el combo aún no está y no puedo posicionarme...por eso quería tenerlos todos en el combo....

    cyndyrdz

    lunes, 15 de septiembre de 2014 18:43