【问题标题】:Windows Store 8.1. XAML Progress Bar between pagesWindows 应用商店 8.1。页面之间的 XAML 进度条
【发布时间】:2014-08-29 07:55:10
【问题描述】:

我的 Windows 8.1 应用商店应用程序中的一个页面出现问题,该页面需要很长时间才能呈现 - 它是一个包含许多列和行的网格,在页面加载时绑定到数据。 缓慢的不是数据的加载,而是数据与网格的实际绑定。

理想情况下,我希望显示一个对话框栏,向用户指示正在加载某些内容,并且他们已经单击了上一个导航按钮。

我看到有人提到有一个“加载页面”的可能性,其中只有一个进度条 - 我认为这个解决方案可能有效,但我无法确定在加载页面的哪个事件中我应该导航到实际页面。

即 用户点击按钮调用

this.Frame.Navigate(typeof(LoadingPage));

加载页面显示进度条

我知道需要能够打电话

this.Frame.Navigate(typeof(ActualPage));

加载 ActualPage 时用户会看到进度条。

任何建议将不胜感激!

【问题讨论】:

  • 您会考虑使用网格视图吗?取决于您的数据模型,但 gridview 具有内置的 UI 虚拟化策略来增量加载对象。

标签: c# xaml windows-store-apps windows-8.1


【解决方案1】:

感谢 DEVExpress 的支持团队,我找到了解决问题的方法。

首先在需要时间加载的页面上,我将 Grid 包装在 ContentControl 中

<ContentControl Visibility="Collapsed" Name="Content">
    <!-- Grid in here -->
</ContentControl>

然后我添加了一个 TextBlock,我将使用它在我的页面上显示“正在加载...”。我已经调用了这个控制指示器。

<TextBlock x:Name="indicator" Text="Loading..." />

我已将以下方法附加到使用计时器的页面的 Loaded 事件中

void MainPage_Loaded(object sender, RoutedEventArgs e)
{

    indicator.Visibility = Windows.UI.Xaml.Visibility.Visible;
    DispatcherTimer t = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
    t.Tick += (dd, ee) =>
    {
        t.Stop();
        Content.Visibility = Windows.UI.Xaml.Visibility.Visible;
    };
    t.Start();
}

然后当网格控件加载后,我隐藏指示器 TextBlock

void gridControl_Loaded(object sender, RoutedEventArgs e)
{
    indicator.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}

这对我来说非常有效。我不能使用 Windows 8 ProgressBar 控件,因为动画是在加载网格的同一线程上加载的 - 但我很高兴有任何指示器。

还要感谢 Brian Stump 为我指明了正确的方向。

【讨论】:

    【解决方案2】:

    首先,由于内置 UI 虚拟化,我建议使用 ListView 或 GridView 来显示数据绑定对象。

    但是,也许这对您的情况有用。

    您知道您的页面何时可以显示吗?如果是这样,请在您的网格在后台加载时将进度环放在前面。

    <Grid x:Name="FullPageGrid">
            <Grid x:Name="YourGridContent">
    
            </Grid>
            <Grid Background="White" Visibility="Visible" x:Name="ProgressRingGrid">
                <ProgressRing IsActive="True"></ProgressRing>
            </Grid>
    </Grid>
    

    数据完全加载后,将“ProgressRingGrid”的可见性更改为 Visibility="Collapsed"

    【讨论】:

    • 感谢您的建议 - 不幸的是,它是第 3 方网格控件,因此我无法使用虚拟化选项。我已经联系了第三者,看看他们有没有什么建议。
    • 据我所知,我不认为我有任何方法知道页面已完成加载 - 如果有一些事件可以在所有内容加载后立即触发,那将是完美的.然后,我将网格的可见性设置为折叠,最初让页面加载并且用户看到他们已经导航,然后在此之后更改网格的可见性。我正在玩弄甚至在计时器上这样做的想法。
    • 您是否使用数据模板来设置网格中的对象?每个框架元素都有一个“加载”事件,您可以将事件处理程序附加到该事件。如果您可以找到要加载的最后一个元素,则更改事件处理程序中的可见性。
    • 我尝试将事件处理程序附加到所有控件的 Loaded 事件,但这些似乎都在页面实际显示之前触发。你是说最后一个要加载的控件的Loaded事件会在页面显示后触发?
    • 内容被渲染后触发加载事件。如果您使用的是来自第 3 方的自定义控件,那么之后可能会发生一些额外的渲染。你用的是什么控件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多