Всплывающее окно из трея C# WPF

kick

Магистр Йода
Administrator
Сообщения
5.010
Розыгрыши
3
Реакции
3.563
Баллы
6.485
Чтобы высчитать первоначальные координаты окна в зависимости от расположения панели задач пишем класс, который определяет местоположение трея и в зависимости от него возвращает координаты топ и лефт нашего окна которое должно выезжать, конечную точку для анимации и свойство окна к которому анимация будет применена.
Код:
using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApplication1
{
    class TrayPos
    {
        public tpos pos;
        private int top;
        private int left;
        private DependencyProperty prop;
        private int end = 0;

        int pw = (int)SystemParameters.PrimaryScreenWidth;
        int ph = (int)SystemParameters.PrimaryScreenHeight;
        int waw = (int)SystemParameters.WorkArea.Width;
        int wah = (int)SystemParameters.WorkArea.Height;

        public void getXY(int width, int height, out int _top, out int _left, out DependencyProperty _prop, out int _end)
        {
            switch(pos)
            {
                case tpos.top:
                    left = pw - width;
                    top = (int)SystemParameters.WorkArea.Top - height;
                    prop = System.Windows.Window.TopProperty;
                    end = (int)SystemParameters.WorkArea.Top;
                    break;
                case tpos.left:
                    left = (int)SystemParameters.WorkArea.Left - width;
                    top = ph - height;
                    prop = System.Windows.Window.LeftProperty;
                    end = (int)SystemParameters.WorkArea.Left;
                    break;
                case tpos.right:
                    left = waw;
                    top = ph - height;
                    prop = System.Windows.Window.LeftProperty;
                    end = waw - width;
                    break;
                case tpos.bottom:
                default:
                    left = pw - width;
                    top = wah;
                    prop = System.Windows.Window.TopProperty;
                    end = wah - height;
                    break;
            }

            _left = left;
            _top = top;
            _prop = prop;
            _end = end;

        }

        public TrayPos()
        {
            if (SystemParameters.WorkArea.Top > 0)
            {
                pos = tpos.top;
            }
            else if (SystemParameters.WorkArea.Left > 0)
            {
                pos = tpos.left;
            }
            else if (pw > waw)
            {
                pos = tpos.right;
            }
            else pos = tpos.bottom;

            MessageBox.Show(pos.ToString());
        }
    }
}
В конструкторе окна которое нам необходимо анимировать после InitializeComponent() ставим этот код
Код:
            TrayPos tpos = new TrayPos();

            tpos.getXY((int)this.Width, (int)this.Height, out top, out left, out prop, out end);
            this.Top = top;
            this.Left = left;
            anim = new DoubleAnimation(end, TimeSpan.FromSeconds(1));
Естественно необходимо в классе окна определить свойства:
Код:
        DoubleAnimation anim;

        int left;
        int top;
        DependencyProperty prop;
        int end;
После всех этих действий подписываемся на событие окна loaded
Код:
        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            AnimationClock clock = anim.CreateClock();
            this.ApplyAnimationClock(prop, clock);
        }
Все готово, теперь чтобы вызвать наше окно и увидеть эффект в основном окне на какое-нибудь событие ставим этот код
Код:
            Window1  notify = new Window1();
            notify.Show();
 
Сверху Снизу