protected static Task <LightBoxAdorner> CreateAdornerAsync(UIElement element) { var tcs = new TaskCompletionSource <LightBoxAdorner>(); var lightbox = new LightBox(); var adorner = CreateAdornerCore(element, lightbox); lightbox.Loaded += (s, e) => { // アニメーションを並列で実行する場合 or // lightbox背景のアニメーションが無い場合は、 // この非同期メソッドは即完了とする if (lightbox.IsParallelInitialize || lightbox.InitializeStoryboard == null) { tcs.SetResult(adorner); } else { lightbox.CompleteInitializeLightBox += (_s, _e) => { tcs.SetResult(adorner); }; } }; return(tcs.Task); }
protected static LightBoxAdorner CreateAdornerModal(UIElement element) { var lightbox = new LightBox(); var adorner = CreateAdornerCore(element, lightbox); if (!lightbox.IsParallelInitialize) { var frame = new DispatcherFrame(); lightbox.CompleteInitializeLightBox += (s, e) => { frame.Continue = false; }; Dispatcher.PushFrame(frame); } return(adorner); }
private static LightBoxAdorner CreateAdornerCore(UIElement element, LightBox lightbox) { // Window系のクラスだったら、Contentプロパティを利用。それ以外の場合はそのまま利用。 var win = element as Window; var target = win?.Content as UIElement ?? element; if (target == null) { return(null); } var layer = AdornerLayer.GetAdornerLayer(target); if (layer == null) { return(null); } // ダイアログ用のAdornerが存在してないので、新規に作って設定して返す。 var adorner = new LightBoxAdorner(target); adorner.SetRoot(lightbox); // Windowに対してAdornerを設定していた場合は、Content要素のMarginを打ち消すためのマージン設定を行う。 if (win != null) { var content = win.Content as FrameworkElement; var margin = content.Margin; adorner.Margin = new Thickness(-margin.Left, -margin.Top, margin.Right, margin.Bottom); adorner.UseAdornedElementSize = false; } // ダイアログ表示時にtargetがEnableだった場合、ダイアログ表示中だけDisable化する。 if (target.IsEnabled) { target.IsEnabled = false; lightbox.AllDialogClosed += (s, e) => { target.IsEnabled = true; }; } // すべてのダイアログがクリアされたときに、Adornerを削除するための処理を追加 lightbox.AllDialogClosed += (s, e) => { layer?.Remove(adorner); }; layer.Add(adorner); return(adorner); }
public void SetRoot(LightBox root) { this.AddVisualChild(root); this.Root = root; }
protected static LightBoxAdorner CreateAdornerModal(UIElement element) { var lightbox = new LightBox(); var adorner = CreateAdornerCore(element, lightbox); if (!lightbox.IsParallelInitialize) { var frame = new DispatcherFrame(); lightbox.CompleteInitializeLightBox += (s, e) => { frame.Continue = false; }; Dispatcher.PushFrame(frame); } return adorner; }
protected static Task<LightBoxAdorner> CreateAdornerAsync(UIElement element) { var tcs = new TaskCompletionSource<LightBoxAdorner>(); var lightbox = new LightBox(); var adorner = CreateAdornerCore(element, lightbox); lightbox.Loaded += (s, e) => { // アニメーションを並列で実行する場合 or // lightbox背景のアニメーションが無い場合は、 // この非同期メソッドは即完了とする if (lightbox.IsParallelInitialize || lightbox.InitializeStoryboard == null) { tcs.SetResult(adorner); } else { lightbox.CompleteInitializeLightBox += (_s, _e) => { tcs.SetResult(adorner); }; } }; return tcs.Task; }
private static LightBoxAdorner CreateAdornerCore(UIElement element, LightBox lightbox) { // Window系のクラスだったら、Contentプロパティを利用。それ以外の場合はそのまま利用。 var win = element as Window; var target = win?.Content as UIElement ?? element; if (target == null) return null; var layer = AdornerLayer.GetAdornerLayer(target); if (layer == null) return null; // ダイアログ用のAdornerが存在してないので、新規に作って設定して返す。 var adorner = new LightBoxAdorner(target); adorner.SetRoot(lightbox); // Windowに対してAdornerを設定していた場合は、Content要素のMarginを打ち消すためのマージン設定を行う。 if (win != null) { var content = win.Content as FrameworkElement; var margin = content.Margin; adorner.Margin = new Thickness(-margin.Left, -margin.Top, margin.Right, margin.Bottom); adorner.UseAdornedElementSize = false; } // すべてのダイアログがクリアされたときに、Adornerを削除するための処理を追加 lightbox.AllDialogClosed += (s, e) => { layer?.Remove(adorner); }; layer.Add(adorner); return adorner; }