예제 #1
0
파일: LightBox.cs 프로젝트: csbuja/Lighty
        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);
        }
예제 #2
0
파일: LightBox.cs 프로젝트: csbuja/Lighty
        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);
        }
예제 #3
0
파일: LightBox.cs 프로젝트: csbuja/Lighty
        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);
        }
예제 #4
0
 public void SetRoot(LightBox root)
 {
     this.AddVisualChild(root);
     this.Root = root;
 }
예제 #5
0
        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;
        }
예제 #6
0
        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;
        }
예제 #7
0
        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;
        }
예제 #8
0
 public void SetRoot(LightBox root)
 {
     this.AddVisualChild(root);
     this.Root = root;
 }