1

我有一个在浏览器中作为 XBAP 运行的 WPF 应用程序。在几个页面上,所有控件都是根据用户选择的内容动态创建的。因此,在加载所有控件之前,应用程序可能看起来没有做任何事情。我希望事先显示某种繁忙的指示器,以向用户显示控件正在加载,它不必动画,但如果这样做会很好。我已经查看了 Telerik 繁忙指示器,但这不起作用,因为它实际上是为了获取单个控件的数据,并且在加载控件之前不显示,这违背了目的。

我正在考虑首先显示一个叠加层或类似的东西,包含一个加载徽标,然后加载其后面的页面并在控件加载时隐藏叠加层。我想知道这是否是解决此问题的最佳方法,或者是否有更好的方法?

4

1 回答 1

2

注意:我没有在 XBAP 浏览器应用程序中尝试过这个,但它在 WPF 应用程序中运行没有任何问题!我在必要时使用 DispatcherTimer 显示沙漏,并将此代码抽象为静态类。

public static class UiServices
{

    /// <summary>
    ///   A value indicating whether the UI is currently busy
    /// </summary>
    private static bool IsBusy;

    /// <summary>
    /// Sets the busystate as busy.
    /// </summary>
    public static void SetBusyState()
    {
        SetBusyState(true);
    }

    /// <summary>
    /// Sets the busystate to busy or not busy.
    /// </summary>
    /// <param name="busy">if set to <c>true</c> the application is now busy.</param>
    private static void SetBusyState(bool busy)
    {
        if (busy != IsBusy)
        {
            IsBusy = busy;
            Mouse.OverrideCursor = busy ? Cursors.Wait : null;

            if (IsBusy)
            {
                new DispatcherTimer(TimeSpan.FromSeconds(0), DispatcherPriority.ApplicationIdle, dispatcherTimer_Tick, Application.Current.Dispatcher);
            }
        }
    }

    /// <summary>
    /// Handles the Tick event of the dispatcherTimer control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    private static void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        var dispatcherTimer = sender as DispatcherTimer;
        if (dispatcherTimer != null)
        {
            SetBusyState(false);
            dispatcherTimer.Stop();
        }
    }
}

你会像这样使用它:

void DoSomething()
{
    UiServices.SetBusyState();
    // Do your thing
}

希望这可以帮助!

于 2013-03-11T22:50:49.217 回答