Files
GeekDesk/Util/MarginHide.cs
2021-12-10 17:58:23 +08:00

207 lines
6.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing; //添加引用
using System.Windows.Forms;//添加引用
using MouseEventArgs = System.Windows.Input.MouseEventArgs;
using System.Windows;
using System.Windows.Media.Animation;
using System.Windows.Media;
namespace GeekDesk.Util
{
enum HidePosition
{
TOP = 1,
LEFT = 2,
RIGHT = 3
}
public class MarginHide
{
readonly Window window;//定义使用该方法的窗体
private readonly int hideTime = 80;
private readonly int taskTime = 200;
private double showMarginWidth = 1;
#pragma warning disable CS0414 // 字段“MarginHide.isHide”已被赋值但从未使用过它的值
private bool isHide;
#pragma warning restore CS0414 // 字段“MarginHide.isHide”已被赋值但从未使用过它的值
public Timer timer;
//构造函数,传入将要匹配的窗体
public MarginHide(Window window)
{
this.window = window;
}
/// <summary>
/// 窗体是否贴边
/// </summary>
/// <returns></returns>
public bool IsMargin()
{
double screenLeft = SystemParameters.VirtualScreenLeft;
double screenTop = SystemParameters.VirtualScreenTop;
double screenWidth = SystemParameters.VirtualScreenWidth;
double windowWidth = window.Width;
double windowTop = window.Top;
double windowLeft = window.Left;
//窗体是否贴边
return (windowLeft <= screenLeft
|| windowTop <= screenTop
|| windowLeft + windowWidth + Math.Abs(screenLeft) >= screenWidth);
}
#region
private void TimerDealy(object o, EventArgs e)
{
if (window.Visibility != Visibility.Visible) return;
double screenLeft = SystemParameters.VirtualScreenLeft;
double screenTop = SystemParameters.VirtualScreenTop;
double screenWidth = SystemParameters.VirtualScreenWidth;
double windowHeight = window.Height;
double windowWidth = window.Width;
double windowTop = window.Top;
double windowLeft = window.Left;
//获取鼠标位置
System.Windows.Point p = MouseUtil.GetMousePosition();
double mouseX = p.X;
double mouseY = p.Y;
//鼠标不在窗口上
if (mouseX < windowLeft || mouseX > windowLeft + windowWidth
|| mouseY < windowTop || mouseY > windowTop + windowHeight)
{
//上方隐藏条件
if (windowTop <= screenTop)
{
HideAnimation(windowTop, screenTop - windowHeight + showMarginWidth, Window.TopProperty);
isHide = true;
return;
}
//左侧隐藏条件
if (windowLeft <= screenLeft)
{
HideAnimation(windowLeft, screenLeft - windowWidth + showMarginWidth, Window.LeftProperty);
return;
}
//右侧隐藏条件
if (windowLeft + windowWidth + Math.Abs(screenLeft) >= screenWidth)
{
HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - showMarginWidth, Window.LeftProperty);
return;
}
} else if (mouseX >= windowLeft && mouseX <= windowLeft + windowWidth
&& mouseY >= windowTop && mouseY <= windowTop + windowHeight)
{
//上方显示
if (windowTop <= screenTop - showMarginWidth)
{
HideAnimation(windowTop, screenTop, Window.TopProperty);
return;
}
//左侧显示
if (windowLeft <= screenLeft - showMarginWidth)
{
HideAnimation(windowLeft, screenLeft, Window.LeftProperty);
return;
}
//右侧显示
if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
{
HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty);
return;
}
}
}
#endregion
public void TimerSet()
{
if (timer != null) return;
timer = new Timer();//添加timer计时器隐藏功能
#region
timer.Interval = taskTime;
timer.Tick += TimerDealy;
timer.Start();
#endregion
}
public void TimerStop()
{
timer.Stop();
timer.Dispose();
timer = null;
//功能关闭 如果界面是隐藏状态 那么要显示界面 ↓
double screenLeft = SystemParameters.VirtualScreenLeft;
double screenTop = SystemParameters.VirtualScreenTop;
double screenWidth = SystemParameters.VirtualScreenWidth;
double windowWidth = window.Width;
double windowTop = window.Top;
double windowLeft = window.Left;
//左侧显示
if (windowLeft <= screenLeft - showMarginWidth)
{
HideAnimation(windowLeft, screenLeft, Window.LeftProperty);
return;
}
//上方显示
if (windowTop <= screenTop - showMarginWidth)
{
HideAnimation(windowTop, screenTop, Window.TopProperty);
return;
}
//右侧显示
if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
{
HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty);
return;
}
}
private void HideAnimation(double from, double to, DependencyProperty property)
{
DoubleAnimation da = new DoubleAnimation
{
From = from,
To = to,
Duration = new Duration(TimeSpan.FromMilliseconds(hideTime))
};
da.Completed += (s, e) =>
{
window.BeginAnimation(property, null);
};
Timeline.SetDesiredFrameRate(da, 60);
window.BeginAnimation(property, da);
}
}
}