1

ブラウザでXBAPとして実行されるWPFアプリケーションがあります。いくつかのページでは、ユーザーが選択した内容に応じて、すべてのコントロールが動的に作成されます。このため、すべてのコントロールがロードされるまで、アプリケーションは何もしていないように見える場合があります。コントロールが読み込まれていることをユーザーに示すために、ある種のビジーインジケーターを事前に表示したいのですが、アニメーション化する必要はありません。テレリックビジーインジケーターを調べましたが、これは実際には単一のコントロールのデータを取得するためのものであり、目的を果たさないコントロールが読み込まれるまで表示されないため、機能しません。

最初に読み込みロゴを含むオーバーレイなどを表示し、次にこの後ろのページを読み込み、コントロールが読み込まれたときにオーバーレイを非表示にすることを考えていました。これが最善の方法なのか、それとももっと良い方法があるのだろうかと思っていました。

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 に答える