|
|
@@ -4,8 +4,8 @@ using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
-using System.Drawing; //添加引用
|
|
|
-using System.Windows.Forms;//添加引用
|
|
|
+using System.Drawing;
|
|
|
+using System.Windows.Forms;
|
|
|
using MouseEventArgs = System.Windows.Input.MouseEventArgs;
|
|
|
using System.Windows;
|
|
|
using System.Windows.Media.Animation;
|
|
|
@@ -14,32 +14,40 @@ using System.Windows.Media;
|
|
|
namespace GeekDesk.Util
|
|
|
{
|
|
|
|
|
|
- enum HidePosition
|
|
|
+ enum HideType
|
|
|
{
|
|
|
- TOP = 1,
|
|
|
- LEFT = 2,
|
|
|
- RIGHT = 3
|
|
|
+ TOP_SHOW = 1,
|
|
|
+ LEFT_SHOW = 2,
|
|
|
+ RIGHT_SHOW = 3,
|
|
|
+ TOP_HIDE = 4,
|
|
|
+ LEFT_HIDE = 5,
|
|
|
+ RIGHT_HIDE = 6
|
|
|
}
|
|
|
|
|
|
public class MarginHide
|
|
|
{
|
|
|
- readonly Window window;//定义使用该方法的窗体
|
|
|
+ private static Window window;//定义使用该方法的窗体
|
|
|
|
|
|
- private readonly int hideTime = 80;
|
|
|
+ private static readonly int hideTime = 200;
|
|
|
+ private static readonly int fadeHideTime = 180;
|
|
|
+ private static readonly int fadeShowTime = 200;
|
|
|
+ private static readonly int taskTime = 250;
|
|
|
|
|
|
- private readonly int taskTime = 200;
|
|
|
+ private static double showMarginWidth = 1;
|
|
|
|
|
|
- private double showMarginWidth = 1;
|
|
|
+ public static bool IS_RUN = false;
|
|
|
+ public static bool IS_HIDE = false;
|
|
|
|
|
|
-#pragma warning disable CS0414 // 字段“MarginHide.isHide”已被赋值,但从未使用过它的值
|
|
|
- private bool isHide;
|
|
|
-#pragma warning restore CS0414 // 字段“MarginHide.isHide”已被赋值,但从未使用过它的值
|
|
|
+ private static Timer timer = null;
|
|
|
|
|
|
- public Timer timer;
|
|
|
- //构造函数,传入将要匹配的窗体
|
|
|
- public MarginHide(Window window)
|
|
|
+ public static void ReadyHide(Window window)
|
|
|
{
|
|
|
- this.window = window;
|
|
|
+ MarginHide.window = window;
|
|
|
+ if (timer != null) return;
|
|
|
+ timer = new Timer();//添加timer计时器,隐藏功能
|
|
|
+ timer.Interval = taskTime;
|
|
|
+ timer.Tick += HideWindow;
|
|
|
+ timer.Start();
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -47,7 +55,7 @@ namespace GeekDesk.Util
|
|
|
/// 窗体是否贴边
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- public bool IsMargin()
|
|
|
+ public static bool IsMargin()
|
|
|
{
|
|
|
double screenLeft = SystemParameters.VirtualScreenLeft;
|
|
|
double screenTop = SystemParameters.VirtualScreenTop;
|
|
|
@@ -64,12 +72,12 @@ namespace GeekDesk.Util
|
|
|
|| windowLeft + windowWidth + Math.Abs(screenLeft) >= screenWidth);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
#region 窗体贴边隐藏功能
|
|
|
- private void TimerDealy(object o, EventArgs e)
|
|
|
+ private static void HideWindow(object o, EventArgs e)
|
|
|
{
|
|
|
- if (window.Visibility != Visibility.Visible) return;
|
|
|
+ if (window.Visibility != Visibility.Visible || !IS_RUN) return;
|
|
|
|
|
|
double screenLeft = SystemParameters.VirtualScreenLeft;
|
|
|
double screenTop = SystemParameters.VirtualScreenTop;
|
|
|
@@ -87,47 +95,59 @@ namespace GeekDesk.Util
|
|
|
double mouseY = p.Y;
|
|
|
|
|
|
//鼠标不在窗口上
|
|
|
- if (mouseX < windowLeft || mouseX > windowLeft + windowWidth
|
|
|
- || mouseY < windowTop || mouseY > windowTop + windowHeight)
|
|
|
+ if ((mouseX < windowLeft || mouseX > windowLeft + windowWidth
|
|
|
+ || mouseY < windowTop || mouseY > windowTop + windowHeight) && !IS_HIDE)
|
|
|
{
|
|
|
//上方隐藏条件
|
|
|
if (windowTop <= screenTop)
|
|
|
{
|
|
|
- HideAnimation(windowTop, screenTop - windowHeight + showMarginWidth, Window.TopProperty);
|
|
|
- isHide = true;
|
|
|
+ IS_HIDE = true;
|
|
|
+ FadeAnimation(1, 0);
|
|
|
+ HideAnimation(windowTop, screenTop - windowHeight + showMarginWidth, Window.TopProperty, HideType.TOP_HIDE);
|
|
|
return;
|
|
|
}
|
|
|
//左侧隐藏条件
|
|
|
if (windowLeft <= screenLeft)
|
|
|
{
|
|
|
- HideAnimation(windowLeft, screenLeft - windowWidth + showMarginWidth, Window.LeftProperty);
|
|
|
+ IS_HIDE = true;
|
|
|
+ FadeAnimation(1, 0);
|
|
|
+ HideAnimation(windowLeft, screenLeft - windowWidth + showMarginWidth, Window.LeftProperty, HideType.LEFT_HIDE);
|
|
|
return;
|
|
|
}
|
|
|
//右侧隐藏条件
|
|
|
if (windowLeft + windowWidth + Math.Abs(screenLeft) >= screenWidth)
|
|
|
{
|
|
|
- HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - showMarginWidth, Window.LeftProperty);
|
|
|
+ IS_HIDE = true;
|
|
|
+ FadeAnimation(1, 0);
|
|
|
+ HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - showMarginWidth, Window.LeftProperty, HideType.RIGHT_HIDE);
|
|
|
return;
|
|
|
}
|
|
|
- } else if (mouseX >= windowLeft && mouseX <= windowLeft + windowWidth
|
|
|
- && mouseY >= windowTop && mouseY <= windowTop + windowHeight)
|
|
|
+ }
|
|
|
+ else if (mouseX >= windowLeft && mouseX <= windowLeft + windowWidth
|
|
|
+ && mouseY >= windowTop && mouseY <= windowTop + windowHeight && IS_HIDE)
|
|
|
{
|
|
|
//上方显示
|
|
|
if (windowTop <= screenTop - showMarginWidth)
|
|
|
{
|
|
|
- HideAnimation(windowTop, screenTop, Window.TopProperty);
|
|
|
+ IS_HIDE = false;
|
|
|
+ HideAnimation(windowTop, screenTop, Window.TopProperty, HideType.TOP_SHOW);
|
|
|
+ FadeAnimation(0, 1);
|
|
|
return;
|
|
|
}
|
|
|
//左侧显示
|
|
|
if (windowLeft <= screenLeft - showMarginWidth)
|
|
|
{
|
|
|
- HideAnimation(windowLeft, screenLeft, Window.LeftProperty);
|
|
|
+ IS_HIDE = false;
|
|
|
+ HideAnimation(windowLeft, screenLeft, Window.LeftProperty, HideType.LEFT_SHOW);
|
|
|
+ FadeAnimation(0, 1);
|
|
|
return;
|
|
|
}
|
|
|
//右侧显示
|
|
|
if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
|
|
|
{
|
|
|
- HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty);
|
|
|
+ IS_HIDE = false;
|
|
|
+ HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty, HideType.RIGHT_SHOW);
|
|
|
+ FadeAnimation(0, 1);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
@@ -136,58 +156,83 @@ namespace GeekDesk.Util
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
- public void TimerSet()
|
|
|
+ public static void StartHide()
|
|
|
{
|
|
|
- if (timer != null) return;
|
|
|
- timer = new Timer();//添加timer计时器,隐藏功能
|
|
|
- #region 计时器设置,隐藏功能
|
|
|
- timer.Interval = taskTime;
|
|
|
- timer.Tick += TimerDealy;
|
|
|
- timer.Start();
|
|
|
- #endregion
|
|
|
+ IS_RUN = true;
|
|
|
}
|
|
|
|
|
|
- public void TimerStop()
|
|
|
+ public static void StopHide()
|
|
|
{
|
|
|
- timer.Stop();
|
|
|
- timer.Dispose();
|
|
|
- timer = null;
|
|
|
+ IS_RUN = false;
|
|
|
//功能关闭 如果界面是隐藏状态 那么要显示界面 ↓
|
|
|
+ if (IS_HIDE)
|
|
|
+ {
|
|
|
+ double screenLeft = SystemParameters.VirtualScreenLeft;
|
|
|
+ double screenTop = SystemParameters.VirtualScreenTop;
|
|
|
+ double screenWidth = SystemParameters.VirtualScreenWidth;
|
|
|
|
|
|
- double screenLeft = SystemParameters.VirtualScreenLeft;
|
|
|
- double screenTop = SystemParameters.VirtualScreenTop;
|
|
|
- double screenWidth = SystemParameters.VirtualScreenWidth;
|
|
|
+ double windowWidth = window.Width;
|
|
|
|
|
|
- double windowWidth = window.Width;
|
|
|
+ double windowTop = window.Top;
|
|
|
+ double windowLeft = window.Left;
|
|
|
|
|
|
- double windowTop = window.Top;
|
|
|
- double windowLeft = window.Left;
|
|
|
-
|
|
|
- //左侧显示
|
|
|
- if (windowLeft <= screenLeft - showMarginWidth)
|
|
|
- {
|
|
|
- HideAnimation(windowLeft, screenLeft, Window.LeftProperty);
|
|
|
- return;
|
|
|
- }
|
|
|
+ //左侧显示
|
|
|
+ if (windowLeft <= screenLeft - showMarginWidth)
|
|
|
+ {
|
|
|
+ IS_HIDE = false;
|
|
|
+ FadeAnimation(0, 1);
|
|
|
+ HideAnimation(windowLeft, screenLeft, Window.LeftProperty, HideType.LEFT_SHOW);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- //上方显示
|
|
|
- if (windowTop <= screenTop - showMarginWidth)
|
|
|
- {
|
|
|
- HideAnimation(windowTop, screenTop, Window.TopProperty);
|
|
|
- return;
|
|
|
- }
|
|
|
+ //上方显示
|
|
|
+ if (windowTop <= screenTop - showMarginWidth)
|
|
|
+ {
|
|
|
+ IS_HIDE = false;
|
|
|
+ FadeAnimation(0, 1);
|
|
|
+ HideAnimation(windowTop, screenTop, Window.TopProperty, HideType.TOP_SHOW);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- //右侧显示
|
|
|
- if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
|
|
|
- {
|
|
|
- HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty);
|
|
|
- return;
|
|
|
+ //右侧显示
|
|
|
+ if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
|
|
|
+ {
|
|
|
+ IS_HIDE = false;
|
|
|
+ FadeAnimation(0, 1);
|
|
|
+ HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty, HideType.RIGHT_SHOW);
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
- private void HideAnimation(double from, double to, DependencyProperty property)
|
|
|
+ private static void HideAnimation(double from, double to, DependencyProperty property, HideType hideType)
|
|
|
{
|
|
|
+
|
|
|
+ double toTemp = to;
|
|
|
+ double leftT = window.Width / 4 * 3;
|
|
|
+ double topT = window.Height / 4 * 3;
|
|
|
+ switch (hideType)
|
|
|
+ {
|
|
|
+ case HideType.LEFT_HIDE:
|
|
|
+ to += leftT;
|
|
|
+ break;
|
|
|
+ case HideType.LEFT_SHOW:
|
|
|
+ to -= leftT;
|
|
|
+ break;
|
|
|
+ case HideType.RIGHT_HIDE:
|
|
|
+ to -= leftT;
|
|
|
+ break;
|
|
|
+ case HideType.RIGHT_SHOW:
|
|
|
+ to += leftT;
|
|
|
+ break;
|
|
|
+ case HideType.TOP_HIDE:
|
|
|
+ to += topT;
|
|
|
+ break;
|
|
|
+ case HideType.TOP_SHOW:
|
|
|
+ to -= topT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
DoubleAnimation da = new DoubleAnimation
|
|
|
{
|
|
|
From = from,
|
|
|
@@ -196,11 +241,48 @@ namespace GeekDesk.Util
|
|
|
};
|
|
|
da.Completed += (s, e) =>
|
|
|
{
|
|
|
+ if ("Top".Equals(property.Name))
|
|
|
+ {
|
|
|
+ window.Top = toTemp;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ window.Left = toTemp;
|
|
|
+ }
|
|
|
window.BeginAnimation(property, null);
|
|
|
};
|
|
|
+
|
|
|
Timeline.SetDesiredFrameRate(da, 60);
|
|
|
window.BeginAnimation(property, da);
|
|
|
}
|
|
|
+
|
|
|
+ private static void FadeAnimation(double from, double to)
|
|
|
+ {
|
|
|
+ double time;
|
|
|
+ if (to == 0D)
|
|
|
+ {
|
|
|
+ time = fadeHideTime;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ time = fadeShowTime;
|
|
|
+ }
|
|
|
+ DoubleAnimation opacityAnimation = new DoubleAnimation
|
|
|
+ {
|
|
|
+ From = from,
|
|
|
+ To = to,
|
|
|
+ Duration = new Duration(TimeSpan.FromMilliseconds(time))
|
|
|
+ };
|
|
|
+ opacityAnimation.Completed += (s, e) =>
|
|
|
+ {
|
|
|
+ //window.Opacity = to;
|
|
|
+ window.BeginAnimation(Window.OpacityProperty, null);
|
|
|
+ };
|
|
|
+ Timeline.SetDesiredFrameRate(opacityAnimation, 60);
|
|
|
+ window.BeginAnimation(Window.OpacityProperty, opacityAnimation);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|