微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wpf 实现childwindow

1.问题:最近手上有个项目,需要用到wpf,wpf没有silverlight的childwindow,这样弹窗口不是很方便

2.解决办法:整合了一下网上意见,得到解决办法如下:  

public static  class ChildWindowBehaviorRegist
    {
        public static void Show(this FrameworkElement control)
        {
            Grid grid = GetRootGrid(control );
            RootAndMask ram = GetRootAndMask(control);

            if (grid != null && ram !=null )
            {
                DoubleAnimation opacityAnimation = new DoubleAnimation(0.5,new Duration(TimeSpan.FromSeconds(0.5)));

                Storyboard opacityBoard = new Storyboard();
                opacityBoard.Children.Add(opacityAnimation);

                Storyboard.SetTarget(opacityAnimation,  ram.MaskRectangle );
                Storyboard.SetTargetProperty(opacityAnimation,new PropertyPath("(Opacity)"));

                opacityBoard.Completed += delegate
                {
                    ScaleTransform scaleTransform = new ScaleTransform(0.0,0.0,control.Width / 2.0,control.Height / 2.0);
                    control.RenderTransform = scaleTransform;

                    grid.Children.Add(control);

                    Storyboard scaleBoard = new Storyboard();

                    DoubleAnimation scaleXAnimation = new DoubleAnimation(1.0,TimeSpan.FromSeconds(0.5));

                    scaleBoard.Children.Add(scaleXAnimation);

                    Storyboard.SetTarget(scaleXAnimation,control);
                    Storyboard.SetTargetProperty(scaleXAnimation,new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleX)"));

                    DoubleAnimation scaleYAnimation = new DoubleAnimation(1.0,TimeSpan.FromSeconds(0.5));

                    scaleBoard.Children.Add(scaleYAnimation);

                    Storyboard.SetTarget(scaleYAnimation,control);
                    Storyboard.SetTargetProperty(scaleYAnimation,new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleY)"));

                    scaleBoard.Begin();
                };

                opacityBoard.Begin();

                grid.Children.Add(ram.MaskRectangle);
            }
        }

        public static void Close(this FrameworkElement control)
        {
            Grid grid = GetRootGrid(control );
            RootAndMask ram = GetRootAndMask(control);
            if (grid != null)
            {
                ScaleTransform scaleTransform = new ScaleTransform(1.0,1.0,control.Height / 2.0);
                control.RenderTransform = scaleTransform;

                Storyboard scaleBoard = new Storyboard();

                DoubleAnimation scaleXAnimation = new DoubleAnimation(0.0,TimeSpan.FromSeconds(0.5));

                scaleBoard.Children.Add(scaleXAnimation);

                Storyboard.SetTarget(scaleXAnimation,control);
                Storyboard.SetTargetProperty(scaleXAnimation,new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleX)"));

                DoubleAnimation scaleYAnimation = new DoubleAnimation(0.0,TimeSpan.FromSeconds(0.5));

                scaleBoard.Children.Add(scaleYAnimation);

                Storyboard.SetTarget(scaleYAnimation,control);
                Storyboard.SetTargetProperty(scaleYAnimation,new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleY)"));

                scaleBoard.Completed += delegate
                {
                    DoubleAnimation opacityAnimation = new DoubleAnimation(0.5,new Duration(TimeSpan.FromSeconds(0.5)));

                    Storyboard opacityBoard = new Storyboard();
                    opacityBoard.Children.Add(opacityAnimation);

                    Storyboard.SetTarget(opacityAnimation,ram.MaskRectangle);
                    Storyboard.SetTargetProperty(opacityAnimation,new PropertyPath("(Opacity)"));

                    opacityBoard.Completed += delegate
                    {
                        grid.Children.Remove(ram.MaskRectangle);
                        grid.Children.Remove(control);
                    };

                    opacityBoard.Begin();
                };

                scaleBoard.Begin();
            }
        }

        static RootAndMask GetRootAndMask(FrameworkElement control)
        {
            if (control == null || control.Tag == null || !(control.Tag is RootAndMask))
                return null;
            return  control.Tag as RootAndMask;
        }

        static Grid GetRootGrid(FrameworkElement control)
        { 
            RootAndMask ram = GetRootAndMask(control);
            FrameworkElement root = ram.Root ;

            while (root is FrameworkElement && root.Parent != null)
            {
                FrameworkElement rootElement = root as FrameworkElement;

                if (rootElement.Parent is FrameworkElement)
                {
                    root = rootElement.Parent as FrameworkElement;
                }
            }
            ContentControl contentControl = root as ContentControl;
            return contentControl.Content as Grid;
        }
    }

    public class RootAndMask
    {
        public FrameworkElement Root { get; set; }
        public Rectangle MaskRectangle = new Rectangle { Fill = new SolidColorBrush(Colors.DarkGray),Opacity = 0.0 };
        public RootAndMask(FrameworkElement root)
        {
            this.Root = root;
        }
    }

3.调用:使用很简单,

编写一个user control

Login{.....},

 public MainWindow()
        {
            InitializeComponent();
            user = new User();
            client = new ChatClient(new InstanceContext(this ));
            Login login = new Login(user,client);
            login.Tag = new RootAndMask(this);
            login.Show();
        }

4.利弊:

     4.1 利:范围广, 只要是继承自FrameworkElement 的,你都可以像childwindow一样使用

     4.2 弊: main page 需要 <mainpage><grid1><grid2></grid></grid><mainpage> 额外添加一个grid1,用grid2布局。tag被占用了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐