繁体   English   中英

windows phone 7 用于列表框加载数据的进度条

[英]windows phone 7 progress bar for a listbox loading data

当列表框完成加载它的数据时,我可以监听一个事件吗? 我有一个文本框和一个列表框,当用户按 Enter 键时,列表框会填充来自 web 服务的结果。 我想在列表框加载时运行进度条,并在完成时将其折叠....

更新

    <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>

这是我的助手转换器 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> { }

在我的 App.xaml....

    xmlns:HelperClasses="clr-namespace:MyVirtualHealthCheck.HelperClasses"
    ...
    <HelperClasses:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" TrueValue="Visible" FalseValue="Collapsed" />

视图模型....

    ...
    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;
    }

没有内置功能。 完成加载数据后,您必须更新进度条。
或者在您的视图 model 中更新 boolean 依赖属性并将进度条绑定到该属性。

更新
基于注释的一些粗略的示例代码。 这是写在这里,没有检查,但你应该明白:

虚拟机:

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}"/>

将页面的 DataContext 设置为视图 model 的实例,然后在视图 model 实例上调用SimulateLoading()

再次更新
我的错误IsIndeterminate是一个布尔值,因此不需要转换器。

您可以创建一个具有进度条的新表单。

进度表将有一个计时器和进度条。

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

要从主窗体调用进度窗体,请使用以下代码

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

要关闭进度表,请使用此代码

Public Sub CloseProgress()

        If Progress IsNot Nothing Then

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

    End Sub

因为进度表单在不同的线程上运行,它不会冻结 UI。

对不起,代码在 VB.NET

您只需按照以下链接我已经发布了一篇文章在 windows 手机 7 应用程序中使用自定义进度条如何在 windows 手机 7 应用程序中创建自定义进度条

在上面的例子中,我只是使用 canvas 控件和 canvas 内部的图像,然后将 canvas 旋转 360 度角。

You just call storyboard.Begin() when you want to show your progress bar displayed and set canvas visibility to visible and when your listBox data completely loaded set canvas visibility to Collapsed and and call storyboard.Stop();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM