开发者

windows phone 7 progress bar for a listbox loading data

开发者 https://www.devze.com 2023-03-12 16:33 出处:网络
Is there an event I can listen for when a listbox has completed loading it\'s data? I have a textbox and a listbox, when the user hits enter, the listbox is populated with results from a web service.

Is there an event I can listen for when a listbox has completed loading it's data? I have a textbox and a listbox, when the user hits enter, the listbox is populated with results from a web service. I'd like to run the progress bar while the listbox is loading and collapse it when it's finished....

UPDATE

    <controls:PivotItem Header="food" Padding="0 110 0 0">

            <Grid x:Name="ContentFood" Grid.Row="2" >

                <StackPanel>
                    ...
                    ...

                    <toolkit:PerformanceProgressBar Name="ppbFoods" HorizontalAlignment="Left" 
                        VerticalAlignment="Center"
                        Width="466" IsIndeterminate="{Binding IsDataLoading}" 
                        Visibility="{Binding IsDataLoading, Converter={StaticResource BoolToVisibilityConverter}}"
                        />


                    <!--Food Results-->
                    <ListBox x:Name="lbFoods" ItemsSource="{Binding Foods}" Padding="5" 
                             SelectionChanged="lbFoods_SelectionChanged" Height="480" >
                        ....
                    </ListBox>

                </StackPanel>
            </Grid>


        </controls:PivotItem>

Here is my helper converter class....

    public class BoolToValueConverter<T> : IValueConverter
{
    public T FalseValue { get; set; }
    public T TrueValue { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return FalseValue;
        else
            return (bool)value ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null ? value.Equals(TrueValue) : false;
    }
}

public class BoolToStringConverter : BoolToValueConverter<String> { }
public class BoolToBrushConverter : BoolToValueConverter<Brush> { }
public class BoolToVisibilityConverter : BoolToValueConverter<Visibility> { }
public class BoolToObjectConverter : BoolToValueConverter<Object> { }

In my App.xaml....

    xmlns:HelperClasses="clr-namespace:MyVirtualHealthCheck.HelperClasse开发者_C百科s"
    ...
    <HelperClasses:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" TrueValue="Visible" FalseValue="Collapsed" />

The viewModel....

    ...
    public bool IsDataLoading
    {
        get;
        set;
    }
    ...
    public void GetFoods(string strSearch)
    {
        IsDataLoading = true;
        WCFService.dcFoodInfoCollection localFoods = IsolatedStorageCacheManager<WCFService.dcFoodInfoCollection>.Retrieve("CurrentFoods");

            if (localFoods != null)
            {
                Foods = localFoods;
            }
            else
            {
                GetFoodsFromWCF(strSearch);
            }
    }


    public void GetFoodsFromWCF(string strSearch)
    {
        IsDataLoading = true;
        wcfProxy.GetFoodInfosAsync(strSearch);
        wcfProxy.GetFoodInfosCompleted += new EventHandler<WCFService.GetFoodInfosCompletedEventArgs>(wcfProxy_GetFoodInfosCompleted);
    }

    void wcfProxy_GetFoodInfosCompleted(object sender, WCFService.GetFoodInfosCompletedEventArgs e)
    {
        WCFService.dcFoodInfoCollection foods = e.Result;
        if (foods != null)
        {
            //set current foods to the results from the web service
            this.Foods = foods;
            this.IsDataLoaded = true;

            //save foods to phone so we can use cached results instead of round tripping to the web service again
            SaveFoods(foods);
        }
        else
        {
            Debug.WriteLine("Web service says: " + e.Result);
        }
        IsDataLoading = false;
    }


There's no built in functionality for this. You'll have to update the progressbar when you've finished loading the data.
Alternatively update a boolean dependency property in your view model and bind the progress bar to that.

Update
Some rough, example code, based on comments. This is written here and not checked but you should get the idea:

The VM:

public class MyViewModel : INotifyPropertyChanged
{
    private bool isLoading;
    public bool IsLoading
    {
        get { return isLoading; }

        set
        {
            isLoading = value;
            NotifyPropertyChanged("IsLoading");
        }
    }

    public void SimulateLoading()
    {
        var bw = new BackgroundWorker();

        bw.RunWorkerCompleted += (s, e) => 
            Deployment.Current.Dispatcher.BeginInvoke(
                () => { IsLoading = false; });

        bw.DoWork += (s, e) =>
        {
            Deployment.Current.Dispatcher.BeginInvoke(() => { IsLoading = true; });
            Thread.Sleep(5000);
        };

        bw.RunWorkerAsync();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

XAML:

<toolkit:PerformanceProgressBar IsEnabled="{Binding IsLoading}" 
                                IsIndeterminate="{Binding IsLoading}"/>

Set the DataContext of the page to an instance of the view model and then call SimulateLoading() on the view model instance.

Update yet again:
My mistake IsIndeterminate is a bool so a converter isn't required.


You can create a new form which will have a progress bar.

The Progress form will have a timer and progress bar.

Private Sub tProgress_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tProgress.Tick
        Count = (Count + 1) Mod ProgressBar1.Maximum
        ProgressBar1.Value = Count
    End Sub

Public Sub KillMe(ByVal o As Object, ByVal e As EventArgs)

        Me.Close()

    End Sub

To Call a progress form from the Main form use the following code

Dim ProgressThread As New Threading.Thread(New Threading.ThreadStart(AddressOf StartProgress))
ProgressThread.Start()

Public Sub ProgressSplash()
        'Show please wait splash
        Progress = New frmProgress
        Application.Run(Progress)

End Sub

To close the progress form use this code

Public Sub CloseProgress()

        If Progress IsNot Nothing Then

            Progress.Invoke(New EventHandler(AddressOf Progress.KillMe))
            Progress.Dispose()
            Progress = Nothing
        End If

    End Sub

Because Progress form runs on a different thread it won't freeze the UI.

Sorry the code is in VB.NET

0

精彩评论

暂无评论...
验证码 换一张
取 消