Чтобы высчитать первоначальные координаты окна в зависимости от расположения панели задач пишем класс, который определяет местоположение трея и в зависимости от него возвращает координаты топ и лефт нашего окна которое должно выезжать, конечную точку для анимации и свойство окна к которому анимация будет применена.
В конструкторе окна которое нам необходимо анимировать после InitializeComponent() ставим этот код
Естественно необходимо в классе окна определить свойства:
После всех этих действий подписываемся на событие окна loaded
Все готово, теперь чтобы вызвать наше окно и увидеть эффект в основном окне на какое-нибудь событие ставим этот код
Код:
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());
}
}
}
Код:
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;
Код:
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
AnimationClock clock = anim.CreateClock();
this.ApplyAnimationClock(prop, clock);
}
Код:
Window1 notify = new Window1();
notify.Show();