ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Всплывающее окно из трея C# WPF (https://forum.antichat.xyz/showthread.php?t=768267)

kick 01.04.2017 22:37

Чтобы высчитать первоначальные координаты окна в зависимости от расположения панели задач пишем класс, который определяет местоположение трея и в зависимости от него возвращает координаты топ и лефт нашего окна которое должно выезжать, конечную точку для анимации и свойство окна к которому анимация будет применена.

Код:


Код:

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();



Время: 20:19