none
Porque no cambia mi PerformanceProgressBar al cargar los datos? RRS feed

  • Pregunta

  • Hola amigos muy buenas a toodos.

    Quisiera pedirles una ayuda sobre PerformanceProgressBar, el problema es que al cargar los datos no se esconde, sigue mostrándose.

    Para mayor entendimiento aqui les muestro mi codigo y una imagen tal como se muestra mi problema.

    La siguiente es mi clase para Convertir los Valores:

    namespace App01
    {
        public class ConvertidorVisibilidad : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                bool visible = false;
                if (value is bool)
                {
                    visible = (bool)value;
                }
    
                return visible ? Visibility.Visible : Visibility.Collapsed;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return (value is Visibility) && (((Visibility)value) == Visibility.Visible);
            }
        }
    }


    Mi clase contexto:

    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Collections.Generic;
    using System.ComponentModel;
    
    using GalaSoft.MvvmLight;
    
    namespace App01
    {
        public class ContextoDatos : ViewModelBase, INotifyPropertyChanged 
        {
            List<Persona> personas;
            private bool indicadorVisibilidad;
            public List<Persona> Personas 
            {
                get
                {
                    return personas;
                }
                set
                {
                    personas = value;
                    this.RaisePropertyChanged(() => Personas);
                }
            }
    
            public ContextoDatos()
            {
                personas = new List<Persona>();
                IndicadorVisibilidad = true;
            }
    
            public bool IndicadorVisibilidad
            {
                get
                {
                    return indicadorVisibilidad;
                }
    
                set
                {
                    indicadorVisibilidad = value;
                    this.RaisePropertyChanged(() => IndicadorVisibilidad);
                }
            }
    
            
        }
    }

    Definiendo mi Convertidor en app.xaml:

    <Converters:ConvertidorVisibilidad x:Key="ConvertidorVisibilidad">
        </Converters:ConvertidorVisibilidad>

    Aqui muestro mi Mi Pagina donde muestro mi lista de personas, y antes de que me muestre los datos quiero que se muestre el progressBar con un mensaje diciendo cargando...., pero una vez cargado quiero que desaparezca.

    <phone:PhoneApplicationPage 
        x:Class="App01.PageB"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
        shell:SystemTray.IsVisible="True">
    
        <!--LayoutRoot es la cuadrícula raíz donde se coloca todo el contenido de la página-->
        <Grid x:Name="LayoutRoot" Background="{StaticResource colorFondo}">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <!--TitlePanel contiene el nombre de la aplicación y el título de la página-->
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock x:Name="ApplicationTitle" Text="Sistema de Enlace a datos" Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock x:Name="PageTitle" Text="Página B" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
    
            <!--ContentPanel. Colocar aquí el contenido adicional-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <StackPanel VerticalAlignment="Center" >
                    <StackPanel x:Name="BusyIndicator"  Orientation="Vertical">
                        <TextBlock Text="Cargando...." HorizontalAlignment="Center" Visibility="{Binding IndicadorVisibilidad, Mode=OneWay, Converter={StaticResource ConvertidorVisibilidad}}"></TextBlock>
                        <toolkit:PerformanceProgressBar x:Name="ProgressBar" HorizontalAlignment="Left"  VerticalAlignment="Center" Width="456" Height="20" IsIndeterminate="True" Visibility="{Binding IndicadorVisibilidad, Mode=OneWay, Converter={StaticResource ConvertidorVisibilidad}}" />
                    </StackPanel>
                </StackPanel>
                <ListBox x:Name="listaPersona" ItemsSource="{Binding Personas}" ItemTemplate="{StaticResource plantillaPersona}"/>
            </Grid>
        </Grid>
     
    </phone:PhoneApplicationPage>

    La siguiente es mi code behind de mi pagina PageB:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using Microsoft.Phone.Controls;
    
    using GalaSoft.MvvmLight;
    
    namespace App01
    {
        public partial class PageB : PhoneApplicationPage
        {
            public PageB()
            {
                InitializeComponent();
                
            }
            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
                
                ContextoDatos fuenteDatos = new ContextoDatos();
                fuenteDatos.Personas.Add(new Persona("Jorge Luis", "Vizcarra", 03, "Lima"));
                fuenteDatos.Personas.Add(new Persona("Jose Luis", "Gonzales", 30, "Lima"));
                fuenteDatos.Personas.Add(new Persona("Carmen", "Gonzales", 30, "Lima"));
    
    
             .....................
    
    
    fuenteDatos.Personas.Add(new Persona("Liz", "Montesinos", 15, "Mejia"));
                this.DataContext = fuenteDatos;
            }
    
            protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
                MainPage pag = e.Content as MainPage;
            }
            
        }
    }

    Aqui muestro la imagen del resultado, donde no desaparece mi ProgressBar:

    Por favor ayúdenme, estoy hace días intentando resolver sin obtener resultado, le agradeceré mucho su ayuda.

    Saludos.


    viernes, 20 de julio de 2012 22:41

Respuestas

  • Hola marcois.

    A lo que se refiere Alejandro, es que aunque tengas el converter, el valor lo tendrás que modificar en algún momento.

    Supongamos este flujo:

    • Se carga la página => indicador de visibilidad = false; (o true si lo quieres tener visible desde el principio)
    • Se comienzan a cargar los datos => se establece el indicador de visibilidad = true;
    • Se terminan de cargar los datos => se establece el indicador de visibilidad = false;

    Este último punto es el que no vemos, y es el que puede que te falte.

    No obstante, cuando establezcas el indicador de visibilidad a false, sólo se ocultará la progressbar porque es quien tiene el binding, y no el panel entero que tiene el texto "Cargando..."

    Otra cosa que veo, es que usas dos stackpanel... anidados sin más contenido, con lo que te podrías ahorrar uno de ellos.


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    lunes, 23 de julio de 2012 11:25

Todas las respuestas

  • Buenas,

    No veo en que lugar pones la propiedad IndicadorVisibilidad a false y ese puede ser el problema.

    Cuando se hayan cargado los datos que quieres, deberías poner  IndicadorVisibilidad  = false y de esta manera se quitaría la barra de carga.

    Saludos.

    viernes, 20 de julio de 2012 22:58
  • Muy buenas Alejando.

    El IndicadorVisibilidad debe cambiar a false utilizando mi clase ConvertidorVisibilidad, es por eso que no lo defino en otras partes.

    namespace App01
    {
        public class ConvertidorVisibilidad : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                bool visible = false;
                if (value is bool)
                {
                    visible = (bool)value;
                }
    
                return visible ? Visibility.Visible : Visibility.Collapsed;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return (value is Visibility) && (((Visibility)value) == Visibility.Visible);
            }
        }
    }

    Saludos.

    viernes, 20 de julio de 2012 23:08
  • Hola marcois.

    A lo que se refiere Alejandro, es que aunque tengas el converter, el valor lo tendrás que modificar en algún momento.

    Supongamos este flujo:

    • Se carga la página => indicador de visibilidad = false; (o true si lo quieres tener visible desde el principio)
    • Se comienzan a cargar los datos => se establece el indicador de visibilidad = true;
    • Se terminan de cargar los datos => se establece el indicador de visibilidad = false;

    Este último punto es el que no vemos, y es el que puede que te falte.

    No obstante, cuando establezcas el indicador de visibilidad a false, sólo se ocultará la progressbar porque es quien tiene el binding, y no el panel entero que tiene el texto "Cargando..."

    Otra cosa que veo, es que usas dos stackpanel... anidados sin más contenido, con lo que te podrías ahorrar uno de ellos.


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    lunes, 23 de julio de 2012 11:25