private static IPendingHandler CallPendingBox(Window owner, string message, string caption, bool canCancel) { return((IPendingHandler)Application.Current.Dispatcher.Invoke(new Func <IPendingHandler>(() => { var setting = PendingBoxSettings.Setting; var windowStyle = XamlUtil.ToXaml(setting.WindowStyle); var cancelButtonStyle = XamlUtil.ToXaml(setting.CancelButtonStyle); var contentTemplate = XamlUtil.ToXaml(setting.ContentTemplate); var spinnerStyle = XamlUtil.ToXaml(setting.SpinnerStyle); var createOnNewThread = setting.CreateOnNewThread; var cancelButtonContent = setting.CancelButtonContent; var interopOwnersMask = setting.InteropOwnersMask; var handler = new PendingHandlerImpl(); var ownerRect = GetOwnerRect(owner); if (createOnNewThread) { var autoReset = new AutoResetEvent(false); var thread = new Thread(() => { var pendingWindow = new PendingBoxWindow(owner, interopOwnersMask, ownerRect, message, caption, canCancel, windowStyle, cancelButtonStyle, spinnerStyle, contentTemplate, cancelButtonContent, handler); pendingWindow.Closed += delegate { pendingWindow.Dispatcher.InvokeShutdown(); }; pendingWindow.Show(); autoReset.Set(); Dispatcher.Run(); }); thread.SetApartmentState(ApartmentState.STA); thread.IsBackground = true; thread.Start(); autoReset.WaitOne(); } else { var pendingWindow = new PendingBoxWindow(owner, interopOwnersMask, null, message, caption, canCancel, windowStyle, cancelButtonStyle, spinnerStyle, contentTemplate, cancelButtonContent, handler); pendingWindow.Show(); } return handler; }))); }
public PendingBoxWindow(Window owner, bool interopOwnersMask, Rect?ownerRect, string message, string caption, bool canCancel, string windowStyle, string cancelButtonStyle, string spinnerStyle, string contentTemplate, object cancelButtonContent, PendingHandlerImpl handler) { _captionText = caption; _messageText = message; _canCancel = canCancel; _cancelButtonContent = cancelButtonContent; _handler = handler; _handler.SetWindow(this); Style = XamlUtil.FromXaml <Style>(windowStyle); ContentTemplate = XamlUtil.FromXaml <DataTemplate>(contentTemplate); _cancelButtonStyle = XamlUtil.FromXaml <Style>(cancelButtonStyle); _spinnerStyle = XamlUtil.FromXaml <Style>(spinnerStyle); if (ownerRect == null) { WindowStartupLocation = owner == null ? WindowStartupLocation.CenterScreen : WindowStartupLocation.CenterOwner; } if (ownerRect == null) { Owner = owner; } else { _ownerRect = ownerRect; Topmost = true; } if (owner is WindowX ownerX && interopOwnersMask) { ownerX.Dispatcher.BeginInvoke(new Action(() => { ownerX.IsMaskVisible = true; })); _owner = ownerX; } Loaded += PendingBoxWindow_Loaded; }