void ProgressDialogTestWithCancelButton()
        {
            // Easy way to pass data to the async method
            int millisecondsTimeout = 1500;

            ProgressDialogResult result = ProgressDialog.Execute(this, "Loading data", (bw, we) => {
                for (int i = 1; i <= 5; i++)
                {
                    if (ProgressDialog.ReportWithCancellationCheck(bw, we, "Executing step {0}/5...", i))
                    {
                        return;
                    }

                    Thread.Sleep(millisecondsTimeout);
                }

                // So this check in order to avoid default processing after the Cancel button has been pressed.
                // This call will set the Cancelled flag on the result structure.
                ProgressDialog.CheckForPendingCancellation(bw, we);
            }, ProgressDialogSettings.WithSubLabelAndCancel);

            if (result.Cancelled)
            {
                MessageBox.Show("ProgressDialog cancelled.");
            }
            else if (result.OperationFailed)
            {
                MessageBox.Show("ProgressDialog failed.");
            }
            else
            {
                MessageBox.Show("ProgressDialog successfully executed.");
            }
        }
        internal static ProgressDialogResult ExecuteInternal(Window owner, string label, object operation, ProgressDialogSettings settings)
        {
            ProgressDialog dialog = new ProgressDialog(settings);

            dialog.Owner = owner;

            if (!string.IsNullOrEmpty(label))
            {
                dialog.Label = label;
            }

            return(dialog.Execute(operation));
        }
        void ProgressDialogTestDefault()
        {
            ProgressDialogResult result = ProgressDialog.Execute(this, "Loading data...", (bw, we) => {
                Thread.Sleep(4000);
            });

            if (result.OperationFailed)
            {
                MessageBox.Show("ProgressDialog failed.");
            }
            else
            {
                MessageBox.Show("ProgressDialog successfully executed.");
            }
        }
        void ProgressDialogTestWithSubLabel()
        {
            ProgressDialogResult result = ProgressDialog.Execute(this, "Loading data", (bw) => {
                for (int i = 1; i <= 5; i++)
                {
                    ProgressDialog.Report(bw, "Executing step {0}/5...", i);

                    Thread.Sleep(1500);
                }
            }, ProgressDialogSettings.WithSubLabel);

            if (result.OperationFailed)
            {
                MessageBox.Show("ProgressDialog failed.");
            }
            else
            {
                MessageBox.Show("ProgressDialog successfully executed.");
            }
        }
        internal static ProgressDialogResult ExecuteInternal(Window owner, string label, object operation, ProgressDialogSettings settings)
        {
            ProgressDialog dialog = new ProgressDialog(settings);
            dialog.Owner = owner;

            if (!string.IsNullOrEmpty(label))
                dialog.Label = label;

            return dialog.Execute(operation);
        }