80 Commits
2.0 ... 2.4.10

Author SHA1 Message Date
liufei
28ebb48983 修改样式 2022-01-07 20:21:06 +08:00
liufei
74e36cc68a 贴边隐藏优化 2022-01-07 20:01:39 +08:00
liufei
9f60f1be63 修复重复设置中间监听 2022-01-07 20:01:11 +08:00
liufei
e9dbc3e5b9 修复过大的遮罩层 2022-01-07 20:00:00 +08:00
liufei
e9a3726bb4 释放资源 2022-01-06 20:12:21 +08:00
liufei
58c67a0497 释放资源 2022-01-06 20:05:40 +08:00
liufei
5ff3f04da6 增加判空处理, 兼容旧版本数据 2022-01-06 19:12:05 +08:00
liufei
14aa73f504 捕获异常 防止退出失败 2022-01-06 18:59:51 +08:00
liufei
5c10b5f59e 修复打开系统项目隐藏窗口无效 2022-01-06 17:55:43 +08:00
liufei
d092db8b5c 增加添加系统应用功能 2022-01-06 17:45:25 +08:00
liufei
1125432c41 修改按钮样式 2022-01-06 17:41:05 +08:00
liufei
e99eee08ff 优化贴边隐藏动画 2022-01-06 17:39:04 +08:00
liufei
fb26834938 显示时不遮挡任务栏 2022-01-06 15:41:57 +08:00
liufei
e9063a176e 未捕获异常不再提示 2022-01-05 17:21:35 +08:00
liufei
6038eee680 捕获未处理异常 2022-01-05 17:11:24 +08:00
liufei
19c8ff9d8d 释放文件流 2022-01-05 11:56:56 +08:00
liufei
e3a85e42fa 系统图标-测试 2021-12-23 17:58:06 +08:00
liufei
09d3a520b4 修复cron表达式待办 无限提醒的bug 2021-12-23 13:09:46 +08:00
liufei
7f585dd095 修改获取磁盘图标 及 快捷名称获取 2021-12-22 18:01:29 +08:00
liufei
353acec75e 增加日志写入 2021-12-22 13:14:54 +08:00
liufei
8d4201f5ba 样式微调, 修复重新打开中间呼出功能失效 2021-12-22 09:34:04 +08:00
liufei
0453cdad66 优化修改菜单名样式 2021-12-21 17:34:16 +08:00
liufei
88af8324b9 双击启动 文件小图标修复 2021-12-21 16:52:31 +08:00
liufei
8ee27e247b 修改编码 2021-12-20 16:51:59 +08:00
liufei
cf8f983f1a 2.3.21 2021-12-20 16:42:58 +08:00
liufei
37e8631f73 修复一个测试遗留bug 2021-12-20 16:39:51 +08:00
liufei
0f6119c0ba 去除选中控件后的虚线 2021-12-20 10:59:37 +08:00
liufei
caf75e2427 不开启中键启动时不再占用线程 2021-12-20 09:56:43 +08:00
liufei
c13593bdf4 Esc退出窗口 2021-12-20 09:42:13 +08:00
liufei
e6a95c4668 增加Esc退出窗口 2021-12-20 09:39:27 +08:00
liufei
3483bf88c2 修复未完全关闭进程的bug 2021-12-13 13:03:50 +08:00
liufei
f96a76e6fb 修改编码 2021-12-13 12:18:13 +08:00
liufei
71f18b801a 修改为utf-8 2021-12-13 12:17:19 +08:00
liufei
1bf0f9c38b 更新信息 2021-12-13 12:07:42 +08:00
Demo-Liu
2efcabe570 Merge branch 'master' into 2.3.20 2021-12-13 11:16:43 +08:00
liufei
8958bddb25 增加隐藏托盘图标的功能 2021-12-13 10:53:55 +08:00
liufei
00f581a03e 删除开发模式代码 增加更新日志 2021-12-13 10:04:15 +08:00
liufei
24ba279b18 样式优化 bug修改 鼠标中键呼出 2021-12-10 17:58:23 +08:00
liufei
ba59e8c354 fix github url 2021-09-15 16:31:32 +08:00
liufei
1c486a5c8a 修改正确的github更新rul 2021-09-15 16:25:51 +08:00
Demo-Liu
95e704279e Update README.md 2021-09-15 16:15:58 +08:00
liufei
8b115ef27c 修改微信赞赏码 2021-09-15 10:54:07 +08:00
liufei
b097001e6c 更新版本信息 2021-09-15 10:12:44 +08:00
Demo-Liu
79de085158 Update README.md 2021-09-13 19:54:23 +08:00
Demo-Liu
cfd2d041af Merge pull request #23 from Demo-Liu/2.3.11
更新说明
2021-09-11 22:06:08 +08:00
Demo_Liu
3d877092e5 更新说明 2021-09-11 22:04:16 +08:00
Demo-Liu
f7ff6e4a46 Merge pull request #22 from Demo-Liu/2.3.11
2.3.11
2021-09-11 21:58:24 +08:00
Demo_Liu
63f9043e00 修复打开项目程序崩溃bug 2021-09-11 21:57:37 +08:00
Demo_Liu
7bfe14c211 修复打开项目程序崩溃的bug 2021-09-11 21:54:54 +08:00
Demo-Liu
af8e0b7df2 Merge pull request #21 from Demo-Liu/2.3
gitee 链接
2021-09-11 17:11:29 +08:00
liufei
b7431c0408 gitee 链接 2021-09-11 17:10:39 +08:00
Demo-Liu
a301e051b6 Merge pull request #20 from Demo-Liu/2.3
修复一个小bug
2021-09-11 16:31:37 +08:00
liufei
d60435cd61 修复一个小bug 2021-09-11 16:28:55 +08:00
Demo-Liu
18501b3afe Merge pull request #19 from Demo-Liu/2.3
2.3
2021-09-11 15:37:31 +08:00
liufei
274541303a '添加自定义图标大小','待办任务可使用CRON表达式自定义提醒频率' 2021-09-11 15:32:30 +08:00
Demo-Liu
5e81f334e2 Update README.md 2021-09-06 13:35:11 +08:00
Demo-Liu
5e1f3fea38 Update README.md 2021-09-06 13:34:49 +08:00
Demo-Liu
1459c35167 Update README.md 2021-08-25 08:43:55 +08:00
Demo-Liu
6f2a5bdc07 Update README.md 2021-08-25 08:43:17 +08:00
liufei
c231587543 优化代码 2021-08-20 16:50:24 +08:00
liufei
787c23ef77 添加 定时内存回收 2021-08-20 16:49:20 +08:00
liufei
7e3babe0c3 修复打开显示设置后 贴边隐藏卡顿的问题 2021-08-20 15:53:58 +08:00
liufei
fd406fea4d 修复无法删除历史待办bug 2021-08-20 15:44:07 +08:00
liufei
d46eae4c6e 修改程序集信息 2021-08-20 15:43:47 +08:00
liufei
4a94aab3c7 修改程序集信息 2021-08-20 15:43:25 +08:00
liufei
8d44429bda 更优雅的实现注册热键 2021-08-20 15:43:02 +08:00
Demo-Liu
6ecb55061f Merge pull request #16 from Demo-Liu/2.2
修复 开启窗口动画,启动项目后无法显示主界面bug
2021-08-19 14:52:53 +08:00
liufei
f11056c469 修复 开启窗口动画,启动项目后无法显示主界面bug 2021-08-19 14:49:01 +08:00
Demo-Liu
c9f19c5084 Merge pull request #15 from Demo-Liu/2.2
'边缘吸附功能','窗口淡入淡出动画','待办任务快捷键(默认Ctrl+Shift+Q)','右键任务栏图标打开程序目录菜单'
2021-08-19 14:01:23 +08:00
liufei
571d7c3d0d '边缘吸附功能','窗口淡入淡出动画','待办任务快捷键(默认Ctrl+Shift+Q)','右键任务栏图标打开程序目录菜单' 2021-08-19 13:59:47 +08:00
Demo-Liu
99eae59dc3 Merge pull request #14 from Demo-Liu/2.1
2.1
2021-08-04 10:31:27 +08:00
liufei
2d67d32b29 部分程序启动报错修复', '重置图标功能程序崩溃修复','添加自定义字体颜色功能','添加URL项目功能' 2021-08-04 10:12:32 +08:00
Demo-Liu
33560ad85a Update README.md 2021-08-03 14:24:02 +08:00
liufei
53481bf907 修复部分程序无法启动bug 2021-08-02 11:01:29 +08:00
liufei
2673b9862c 删除重复更新源 2021-07-30 08:50:25 +08:00
liufei
4c0a97b7b1 延迟检查更新 2021-07-29 17:09:25 +08:00
liufei
0a89255ad2 优化交互显示界面 2021-07-29 17:04:36 +08:00
liufei
3c78b058cf 取消优先选择 32位系统可能导致的找不到文件的BUG 2021-07-29 13:45:51 +08:00
Demo-Liu
9a5882ff98 Merge pull request #13 from Demo-Liu/2.0
修改程序集版本号
2021-07-29 08:56:03 +08:00
Demo-Liu
0107ac8317 Merge pull request #12 from Demo-Liu/2.0
2.0正式版
2021-07-28 13:43:43 +08:00
94 changed files with 4517 additions and 1309 deletions

View File

@@ -1,5 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections>
<section
name="SystemIcons"
type="System.Configuration.DictionarySectionHandler" />
</configSections>
<SystemIcons>
<add key="Calculator" value="计算器"/>
<add key="Computer" value="此电脑"/>
<add key="GroupPolicy" value="组策略"/>
<add key="Network" value="网络连接"/>
<add key="RecycleBin" value="回收站"/>
<add key="Registry" value="注册表编辑器"/>
<add key="Notepad" value="记事本"/>
<add key="Mstsc" value="远程桌面连接"/>
<add key="Control" value="控制面板"/>
<add key="CMD" value="命令行"/>
</SystemIcons>
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup> </startup>
@@ -21,15 +38,32 @@
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly> </dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
<appSettings> <appSettings>
<add key="Version" value="2.0" /> <add key="Version" value="2.4.10" />
<add key="GitHubUrl" value="https://github.com/Demo-Liu/GeekDesk" /> <add key="GitHubUrl" value="https://github.com/Demo-Liu/GeekDesk" />
<add key="GiteeUrl" value="https://gitee.com/demo_liu/GeekDesk/tree/master" /> <add key="GiteeUrl" value="https://gitee.com/demo_liu/GeekDesk/tree/master" />
<add key="GitHubUpdateUrl" value="https://demo-liu.github.io/GeekDesk/Update.json" /> <add key="GitHubUpdateUrl" value="https://demo-liu.github.io/GeekDesk/Update.json" />
<add key="GiteeUpdateUrl" value="https://demo-liu.github.io/GeekDesk/Update.json" /> <add key="GiteeUpdateUrl" value="https://demo-liu.github.io/GeekDesk/Update.json" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
<add key="CustomIconTeachUrl" value="https://mp.weixin.qq.com/s/LxoHAekho9HBVl4FRw_Law"/>
</appSettings> </appSettings>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration> </configuration>

View File

@@ -12,6 +12,7 @@
<ResourceDictionary Source="/GeekDesk;component/Resource/Dictionary/Geometry.xaml"/> <ResourceDictionary Source="/GeekDesk;component/Resource/Dictionary/Geometry.xaml"/>
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/> <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/> <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
<ResourceDictionary Source="/GeekDesk;component/Resource/Dictionary/CommonStyle.xaml"/>
</ResourceDictionary.MergedDictionaries> </ResourceDictionary.MergedDictionaries>
</ResourceDictionary> </ResourceDictionary>
</Application.Resources> </Application.Resources>

View File

@@ -1,7 +1,9 @@
using GeekDesk.Constant; using GeekDesk.Constant;
using GeekDesk.Util;
using Microsoft.Win32; using Microsoft.Win32;
using System; using System;
using System.IO; using System.IO;
using System.Text;
using System.Windows; using System.Windows;
using System.Windows.Media.Animation; using System.Windows.Media.Animation;
using System.Windows.Threading; using System.Windows.Threading;
@@ -19,12 +21,17 @@ namespace GeekDesk
public App() public App()
{ {
this.Startup += new StartupEventHandler(App_Startup); this.Startup += new StartupEventHandler(App_Startup);
Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
} }
private void App_Startup(object sender, StartupEventArgs e) private void App_Startup(object sender, StartupEventArgs e)
{ {
bool ret; mutex = new System.Threading.Mutex(true, Constants.MY_NAME, out bool ret);
if (!ret)
{
System.Threading.Thread.Sleep(2000);
mutex = new System.Threading.Mutex(true, Constants.MY_NAME, out ret); mutex = new System.Threading.Mutex(true, Constants.MY_NAME, out ret);
if (!ret) if (!ret)
{ {
@@ -33,45 +40,23 @@ namespace GeekDesk
} }
} }
void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = true;//使用这一行代码告诉运行时该异常被处理了不再作为UnhandledException抛出了。
// private void WriteLog(object exception) LogUtil.WriteErrorLog(e, "未捕获异常!");
// { if (Constants.DEV)
// Exception ex = exception as Exception; {
MessageBox.Show("GeekDesk遇到一个问题, 不用担心, 这不影响其它操作!");
// using (FileStream fs = File.Open(".//ErrorLog.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)) }
// { }
// fs.Seek(0, SeekOrigin.End);
// byte[] buffer = Encoding.Default.GetBytes("-------------------------------------------------------\r\n"); void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
// fs.Write(buffer, 0, buffer.Length); {
LogUtil.WriteErrorLog(e, "严重异常!");
// buffer = Encoding.Default.GetBytes(DateTime.Now.ToString() + "\r\n"); MessageBox.Show("GeekDesk遇到未知问题崩溃!");
// fs.Write(buffer, 0, buffer.Length); }
// if (ex != null)
// { }
// buffer = Encoding.Default.GetBytes("成员名: " + ex.TargetSite + "\r\n");
// fs.Write(buffer, 0, buffer.Length);
// buffer = Encoding.Default.GetBytes("引发异常的类: " + ex.TargetSite.DeclaringType + "\r\n");
// fs.Write(buffer, 0, buffer.Length);
// buffer = Encoding.Default.GetBytes("异常信息: " + ex.Message + "\r\n");
// fs.Write(buffer, 0, buffer.Length);
// buffer = Encoding.Default.GetBytes("引发异常的程序集或对象: " + ex.Source + "\r\n");
// fs.Write(buffer, 0, buffer.Length);
// buffer = Encoding.Default.GetBytes("栈:" + ex.StackTrace + "\r\n");
// fs.Write(buffer, 0, buffer.Length);
// }
// else
// {
// buffer = Encoding.Default.GetBytes("应用程序错误: " + exception.ToString() + "\r\n");
// fs.Write(buffer, 0, buffer.Length);
// }
// }
//}
} }

19
Constant/CommonEnum.cs Normal file
View File

@@ -0,0 +1,19 @@
/// <summary>
/// 默认参数
/// </summary>
namespace GeekDesk.Constant
{
public enum CommonEnum
{
WINDOW_WIDTH = 950, //默认窗体宽度
WINDOW_HEIGHT = 650, //默认窗体高度
MENU_CARD_WIDHT = 165, //默认菜单栏宽度
IMAGE_WIDTH = 45, //默认图标宽度
IMAGE_HEIGHT = 45, //默认图标高度
IMAGE_WIDTH_AM = 52, //动画变换宽度
IMAGE_HEIGHT_AM = 52, //动画变换高度
IMAGE_PANEL_WIDTH = 110, //图标容器宽度
IMAGE_PANEL_HEIGHT = 90, //图标容器高度
WINDOW_ANIMATION_TIME = 200, //主窗口动画时间,
}
}

File diff suppressed because one or more lines are too long

14
Constant/IconType.cs Normal file
View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GeekDesk.Constant
{
public enum IconType
{
OTHER = 1, //直接打开
URL = 2 //调用浏览器打开
}
}

View File

@@ -1,16 +0,0 @@
/// <summary>
/// 默认参数
/// </summary>
namespace GeekDesk.Constant
{
public enum MainWindowEnum
{
WINDOW_WIDTH = 666, //默认窗体宽度
WINDOW_HEIGHT = 500, //默认窗体高度
MENU_CARD_WIDHT = 165, //默认菜单栏宽度
IMAGE_WIDTH = 50, //默认图标宽度
IMAGE_HEIGHT = 50, //默认图标高度
IMAGE_WIDTH_AM = 60, //动画变换宽度
IMAGE_HEIGHT_AM = 60 //动画变换高度
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GeekDesk.Constant
{
public enum TodoTaskExecType
{
SET_TIME = 1, //指定时间
CRON = 2 //cron表达式
}
}

View File

@@ -2,11 +2,15 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
Background="AliceBlue" BorderThickness="0"
BorderThickness="1" Style="{StaticResource BorderBG}"
Margin="15"
BorderBrush="{DynamicResource BorderBrush}" BorderBrush="{DynamicResource BorderBrush}"
Width="320" Width="320"
Height="450"> Height="450">
<Border.Background>
<SolidColorBrush Color="AliceBlue" Opacity="0.96"/>
</Border.Background>
<Grid> <Grid>
<Image Source="/Resource/Image/BacklogImg.png" Margin="22,35,22,361" /> <Image Source="/Resource/Image/BacklogImg.png" Margin="22,35,22,361" />
@@ -32,7 +36,7 @@
</hc:Card.Footer> </hc:Card.Footer>
</hc:Card> </hc:Card>
<hc:UniformSpacingPanel Spacing="20" HorizontalAlignment="Center" Margin="0,346,0,0"> <hc:UniformSpacingPanel Spacing="20" HorizontalAlignment="Center" Margin="45.5,310,42.5,36">
<hc:TextBox x:Name="DelayTime" Height="20" Width="60" Text="10" PreviewTextInput="DelayTime_PreviewTextInput" PreviewLostKeyboardFocus="DelayTime_PreviewLostKeyboardFocus" /> <hc:TextBox x:Name="DelayTime" Height="20" Width="60" Text="10" PreviewTextInput="DelayTime_PreviewTextInput" PreviewLostKeyboardFocus="DelayTime_PreviewLostKeyboardFocus" />
<ComboBox x:Name="DelayType" hc:DropDownElement.ConsistentWidth="False" SelectedIndex="0" Height="20" Width="60"> <ComboBox x:Name="DelayType" hc:DropDownElement.ConsistentWidth="False" SelectedIndex="0" Height="20" Width="60">
<ComboBox.Items> <ComboBox.Items>

View File

@@ -1,6 +1,9 @@
using GeekDesk.Task; using GeekDesk.Constant;
using GeekDesk.Task;
using GeekDesk.Util; using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using HandyControl.Controls;
using Quartz;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -34,8 +37,38 @@ namespace GeekDesk.Control.Other
{ {
ToDoInfo info = this.DataContext as ToDoInfo; ToDoInfo info = this.DataContext as ToDoInfo;
info.DoneTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); info.DoneTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
if (info.ExecType == TodoTaskExecType.CRON)
{
CronExpression exp = new CronExpression(info.Cron);
DateTime nowTime = DateTime.Now;
//计算下次执行时间
DateTime nextTime = DateTime.SpecifyKind(exp.GetNextValidTimeAfter(nowTime).Value.LocalDateTime, DateTimeKind.Local);
string nextTimeStr = nextTime.ToString("yyyy-MM-dd HH:mm:ss");
info.ExeTime = nextTimeStr;
TimeSpan ts = nextTime.Subtract(nowTime);
int minutes = (int)Math.Ceiling(ts.TotalMinutes);
if (minutes < 0)
{
minutes = 0;
}
if (minutes > 60)
{
int m = minutes % 60;
int h = minutes / 60;
Growl.SuccessGlobal("下次任务将在 " + h + " 小时零 " + m + " 分钟后提醒您!");
}
else
{
Growl.SuccessGlobal("下次任务将在 " + minutes + " 分钟后提醒您!");
}
} else
{
appData.ToDoList.Remove(info); //执行任务删除 appData.ToDoList.Remove(info); //执行任务删除
appData.HiToDoList.Add(info); //添加历史任务 appData.HiToDoList.Add(info); //添加历史任务
}
ToDoTask.activityBacklog[info].Close(); //关闭桌面通知 ToDoTask.activityBacklog[info].Close(); //关闭桌面通知
ToDoTask.activityBacklog.Remove(info);//激活任务删除 ToDoTask.activityBacklog.Remove(info);//激活任务删除
CommonCode.SaveAppData(appData); CommonCode.SaveAppData(appData);
@@ -93,9 +126,11 @@ namespace GeekDesk.Control.Other
{ {
case "分": case "分":
info.ExeTime = DateTime.Now.AddMinutes(time).ToString("yyyy-MM-dd HH:mm:ss"); info.ExeTime = DateTime.Now.AddMinutes(time).ToString("yyyy-MM-dd HH:mm:ss");
Growl.SuccessGlobal("将在 " + time + " 分钟后再次提醒您!");
break; break;
case "时": case "时":
info.ExeTime = DateTime.Now.AddHours(time).ToString("yyyy-MM-dd HH:mm:ss"); info.ExeTime = DateTime.Now.AddHours(time).ToString("yyyy-MM-dd HH:mm:ss");
Growl.SuccessGlobal("将在 " + time + " 小时后再次提醒您!");
break; break;
} }
ToDoTask.activityBacklog[info].Close(); //关闭桌面通知 ToDoTask.activityBacklog[info].Close(); //关闭桌面通知

View File

@@ -5,7 +5,8 @@
CornerRadius="3" CornerRadius="3"
Width="400" Width="400"
Height="230" Height="230"
Opacity="0.95"> Opacity="0.95"
Style="{StaticResource BorderBG}">
<Border.Resources> <Border.Resources>
<Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}"> <Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}">
<Setter Property="Width" Value="100"/> <Setter Property="Width" Value="100"/>
@@ -14,10 +15,7 @@
<Setter Property="FontSize" Value="14"/> <Setter Property="FontSize" Value="14"/>
</Style> </Style>
</Border.Resources> </Border.Resources>
<Border.Background> <StackPanel Margin="10">
<SolidColorBrush Color="AliceBlue" Opacity="1"/>
</Border.Background>
<hc:SimplePanel Margin="10">
<Grid Margin="8,20,8,20"> <Grid Margin="8,20,8,20">
<hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,-10"> <hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,-10">
@@ -37,15 +35,16 @@
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<TextBlock Text="注: 需配置正确的url方可加载远程图标!" Foreground="Red" Margin="10,95,-10,-92" /> <TextBlock Text="注: 需配置正确的url方可加载远程图标!" Foreground="Red" Margin="10,95,-10,-92" />
<hc:UniformSpacingPanel Spacing="10" Margin="246.206,124.551,-246.206,-124.551"> <hc:UniformSpacingPanel Spacing="10" Margin="203,125,-203,-125">
<Button Content="取消" Command="hc:ControlCommands.Close" <Button Content="取消" Command="hc:ControlCommands.Close" HorizontalAlignment="Stretch" Margin="-1,1,1,1" VerticalAlignment="Stretch"
/> />
<Button Content="教程" Click="Teach_Click"
Style="{StaticResource Btn1}"/>
<Button Content="保存" Click="Confirm_Click" <Button Content="保存" Click="Confirm_Click"
Command="hc:ControlCommands.Close" Command="hc:ControlCommands.Close"
Background="#5BC0DE" Style="{StaticResource Btn1}"/>
Foreground="White"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
</Grid> </Grid>
<!--<Button Width="22" Height="22" Command="hc:ControlCommands.Close" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,4,4,0"/>--> <!--<Button Width="22" Height="22" Command="hc:ControlCommands.Close" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,4,4,0"/>-->
</hc:SimplePanel> </StackPanel>
</Border> </Border>

View File

@@ -3,6 +3,8 @@ using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using Microsoft.Win32; using Microsoft.Win32;
using System; using System;
using System.Configuration;
using System.Diagnostics;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
@@ -40,5 +42,12 @@ namespace GeekDesk.Control.Other
IconfontWindow.vm.IsSettingUrl = "false"; IconfontWindow.vm.IsSettingUrl = "false";
} }
} }
private void Teach_Click(object sender, RoutedEventArgs e)
{
string url = ConfigurationManager.AppSettings["CustomIconTeachUrl"];
Process.Start(url);
}
} }
} }

View File

@@ -3,35 +3,36 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
CornerRadius="4" CornerRadius="4"
Width="300" Width="350"
Height="300" Height="450"
Opacity="0.9"> Style="{StaticResource BorderBG}"
>
<Border.Resources> <Border.Resources>
<Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}"> <Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}">
<Setter Property="Width" Value="40"/> <Setter Property="Width" Value="75"/>
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Left"/> <Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="0,8,0,0"/>
<Setter Property="FontSize" Value="14"/> <Setter Property="FontSize" Value="14"/>
</Style> </Style>
</Border.Resources> </Border.Resources>
<Border.Background> <hc:SimplePanel Margin="10" VerticalAlignment="Center">
<SolidColorBrush Color="AliceBlue" Opacity="0.9"/> <StackPanel>
</Border.Background> <Button Width="22" Height="22" Command="hc:ControlCommands.Close" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top"/>
<hc:SimplePanel Margin="10"> <hc:UniformSpacingPanel Spacing="10">
<Grid Margin="8,20,8,20">
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<TextBlock Text="名称:" Style="{StaticResource LeftTB}"/> <TextBlock Text="名称:" Style="{StaticResource LeftTB}"/>
<TextBox x:Name="IconName" Text="{Binding Name, Mode=OneWay}" Width="180" FontSize="14"/> <TextBox x:Name="IconName" Text="{Binding Name, Mode=OneWay}" Width="230" FontSize="14"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" Margin="0,50,0,71" LineStroke="Black" Grid.ColumnSpan="4"/> <hc:Divider LineStrokeDashArray="3,3" LineStroke="Black"/>
<hc:UniformSpacingPanel Spacing="10" Margin="0,59,0,-9" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<TextBlock Text="图标:" Style="{StaticResource LeftTB}"/> <TextBlock Text="图标:" Style="{StaticResource LeftTB}"/>
<Image x:Name="IconImg" Source="{Binding BitmapImage, Mode=OneWay}" Width="60" Height="60"/> <Image x:Name="IconImg" Source="{Binding BitmapImage, Mode=OneWay}" RenderOptions.BitmapScalingMode="HighQuality" Width="60" Height="60"/>
<Button Content="修改" Click="EditImage"/> <Button Content="修改" Click="EditImage"/>
<Button Content="重置" Click="ReStoreImage"/> <Button Content="重置" Click="ReStoreImage"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" Margin="0,128,0,23" LineStroke="Black" Grid.ColumnSpan="4"/> <hc:Divider LineStrokeDashArray="3,3" LineStroke="Black" Grid.ColumnSpan="4"/>
<hc:UniformSpacingPanel Spacing="10" Margin="0,150,0,10" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10">
<CheckBox x:Name="IconIsAdmin" Content="始终以管理员方式启动" IsChecked="{Binding AdminStartUp, Mode=OneWay}"> <CheckBox x:Name="IconIsAdmin" Content="始终以管理员方式启动" IsChecked="{Binding AdminStartUp, Mode=OneWay}">
<CheckBox.Background> <CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0"> <LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
@@ -40,11 +41,14 @@
</CheckBox.Background> </CheckBox.Background>
</CheckBox> </CheckBox>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" Margin="0,200,0,-27" LineStroke="Black" Grid.ColumnSpan="4"/> <hc:Divider LineStrokeDashArray="3,3" LineStroke="Black" Grid.ColumnSpan="4"/>
<hc:UniformSpacingPanel Spacing="10" Margin="0,218,0,-38" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10">
<Button Content="保存" Command="hc:ControlCommands.Close" Click="SaveProperty" Margin="208,6,-208,-10"/> <TextBlock Text="启动参数:" Style="{StaticResource LeftTB}"/>
<TextBox x:Name="StartArg" Text="{Binding StartArg, Mode=OneWay}" Width="230" Height="100" TextWrapping="Wrap" FontSize="14"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
</Grid> <hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<Button Width="22" Height="22" Command="hc:ControlCommands.Close" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,4,4,0"/> <Button Content="保存" Style="{StaticResource Btn1}" Click="SaveProperty" Margin="265,10,0,0"/>
</hc:UniformSpacingPanel>
</StackPanel>
</hc:SimplePanel> </hc:SimplePanel>
</Border> </Border>

View File

@@ -14,6 +14,7 @@ namespace GeekDesk.Control.Other
/// </summary> /// </summary>
public partial class IconInfoDialog public partial class IconInfoDialog
{ {
public HandyControl.Controls.Dialog dialog;
public IconInfoDialog() public IconInfoDialog()
{ {
@@ -37,7 +38,9 @@ namespace GeekDesk.Control.Other
info.BitmapImage = IconImg.Source as BitmapImage; info.BitmapImage = IconImg.Source as BitmapImage;
info.Name = IconName.Text; info.Name = IconName.Text;
info.AdminStartUp = IconIsAdmin.IsChecked.Value; info.AdminStartUp = IconIsAdmin.IsChecked.Value;
info.StartArg = StartArg.Text;
CommonCode.SaveAppData(MainWindow.appData); CommonCode.SaveAppData(MainWindow.appData);
dialog.Close();
} }
/// <summary> /// <summary>
@@ -47,7 +50,7 @@ namespace GeekDesk.Control.Other
/// <param name="e"></param> /// <param name="e"></param>
private void ReStoreImage(object sender, RoutedEventArgs e) private void ReStoreImage(object sender, RoutedEventArgs e)
{ {
IconInfo info = ((Button)sender).Tag as IconInfo; IconInfo info = this.DataContext as IconInfo;
info.BitmapImage = ImageUtil.ByteArrToImage(info.DefaultImage); info.BitmapImage = ImageUtil.ByteArrToImage(info.DefaultImage);
CommonCode.SaveAppData(MainWindow.appData); CommonCode.SaveAppData(MainWindow.appData);
} }
@@ -72,9 +75,10 @@ namespace GeekDesk.Control.Other
info.BitmapImage = ImageUtil.GetBitmapIconByPath(ofd.FileName); info.BitmapImage = ImageUtil.GetBitmapIconByPath(ofd.FileName);
CommonCode.SaveAppData(MainWindow.appData); CommonCode.SaveAppData(MainWindow.appData);
} }
} catch (Exception) } catch (Exception e1)
{ {
HandyControl.Controls.Growl.WarningGlobal("修改图标失败,已重置为默认图标!"); HandyControl.Controls.Growl.WarningGlobal("修改图标失败,已重置为默认图标!");
LogUtil.WriteErrorLog(e1, "修改图标失败!");
} }
} }

View File

@@ -0,0 +1,46 @@
<Border x:Class="GeekDesk.Control.Other.IconInfoUrlDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hc="https://handyorg.github.io/handycontrol"
CornerRadius="4"
Width="300"
Height="340"
Style="{StaticResource BorderBG}"
>
<Border.Resources>
<Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}">
<Setter Property="Width" Value="40"/>
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="0,8,0,0"/>
<Setter Property="FontSize" Value="14"/>
</Style>
</Border.Resources>
<hc:SimplePanel Margin="10">
<StackPanel>
<Button Width="22" Height="22" Command="hc:ControlCommands.Close" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top"/>
<hc:UniformSpacingPanel Spacing="10" VerticalAlignment="Center">
<TextBlock Text="名称:" Style="{StaticResource LeftTB}"/>
<TextBox x:Name="IconName" Text="{Binding Name, Mode=OneWay}" Width="180" FontSize="14"/>
</hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" LineStroke="Black"/>
<hc:UniformSpacingPanel Spacing="10" VerticalAlignment="Center">
<TextBlock Text="Url:" Style="{StaticResource LeftTB}"/>
<TextBox x:Name="IconUrl" Text="{Binding Path, Mode=OneWay}" Width="180" FontSize="14"/>
</hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" LineStroke="Black"/>
<hc:UniformSpacingPanel Spacing="10" VerticalAlignment="Center">
<TextBlock Text="图标:" Style="{StaticResource LeftTB}"/>
<Image x:Name="IconImg" Source="{Binding BitmapImage, Mode=OneWay}" RenderOptions.BitmapScalingMode="HighQuality" Width="60" Height="60"/>
<Button Content="修改" Click="EditImage"/>
<Button Content="重置" Click="ReStoreImage"/>
</hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" LineStroke="Black"/>
<hc:UniformSpacingPanel Spacing="10">
<Button Content="保存" Click="SaveProperty" Style="{StaticResource Btn1}" Margin="224,-10,-224,0" />
</hc:UniformSpacingPanel>
</StackPanel>
</hc:SimplePanel>
</Border>

View File

@@ -0,0 +1,100 @@
using GeekDesk.Constant;
using GeekDesk.Util;
using GeekDesk.ViewModel;
using Microsoft.Win32;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace GeekDesk.Control.Other
{
/// <summary>
/// TextDialog.xaml 的交互逻辑
/// </summary>
public partial class IconInfoUrlDialog
{
public HandyControl.Controls.Dialog dialog;
private bool newIconInfo;
public IconInfoUrlDialog()
{
newIconInfo = true;
IconInfo info = new IconInfo
{
BitmapImage = ImageUtil.Base64ToBitmapImage(Constants.URL_ICON_IMG_BASE64),
};
info.DefaultImage = info.ImageByteArr;
info.IconType = IconType.URL;
this.DataContext = info;
InitializeComponent();
}
public IconInfoUrlDialog(IconInfo info)
{
this.DataContext = info;
newIconInfo = false;
InitializeComponent();
}
/// <summary>
/// 保存修改属性
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SaveProperty(object sender, RoutedEventArgs e)
{
IconInfo info = this.DataContext as IconInfo;
info.BitmapImage = IconImg.Source as BitmapImage;
info.Name = IconName.Text;
info.Path = IconUrl.Text;
if (newIconInfo)
{
MainWindow.appData.MenuList[MainWindow.appData.AppConfig.SelectedMenuIndex].IconList.Add(info);
}
CommonCode.SaveAppData(MainWindow.appData);
dialog.Close();
}
/// <summary>
/// 修改图标为默认
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ReStoreImage(object sender, RoutedEventArgs e)
{
IconInfo info = this.DataContext as IconInfo;
info.BitmapImage = ImageUtil.ByteArrToImage(info.DefaultImage);
CommonCode.SaveAppData(MainWindow.appData);
}
/// <summary>
/// 修改图标
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void EditImage(object sender, RoutedEventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog
{
Multiselect = false, //只允许选中单个文件
Filter = "所有文件(*.*)|*.*"
};
if (ofd.ShowDialog() == true)
{
IconInfo info = this.DataContext as IconInfo;
info.BitmapImage = ImageUtil.GetBitmapIconByPath(ofd.FileName);
CommonCode.SaveAppData(MainWindow.appData);
}
} catch (Exception e1)
{
HandyControl.Controls.Growl.WarningGlobal("修改图标失败,已重置为默认图标!");
LogUtil.WriteErrorLog(e1, "修改图标失败!");
}
}
}
}

View File

@@ -1,56 +0,0 @@
<Border x:Class="GeekDesk.Control.Other.MenuGeometryDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hc="https://handyorg.github.io/handycontrol"
CornerRadius="10"
Width="300"
Height="300"
Opacity="0.9">
<!--<Border.Resources>
<Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}">
<Setter Property="Width" Value="40"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="FontSize" Value="14"/>
</Style>
</Border.Resources>
<Border.Background>
<SolidColorBrush Color="AliceBlue" Opacity="0.9"/>
</Border.Background>
<hc:SimplePanel Margin="10">
<Grid Margin="8,20,8,20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="93*"/>
<ColumnDefinition Width="38*"/>
<ColumnDefinition Width="126*"/>
<ColumnDefinition Width="7*"/>
</Grid.ColumnDefinitions>
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<TextBlock Text="名称:" Style="{StaticResource LeftTB}"/>
<TextBox x:Name="IconName" Text="{Binding Name, Mode=OneWay}" Width="180" FontSize="14"/>
</hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" Margin="0,50,0,71" LineStroke="Black" Grid.ColumnSpan="4"/>
<hc:UniformSpacingPanel Spacing="10" Margin="0,59,0,-9" Grid.ColumnSpan="4">
<TextBlock Text="图标:" Style="{StaticResource LeftTB}"/>
<Image x:Name="IconImg" Source="{Binding BitmapImage, Mode=OneWay}" Width="60" Height="60"/>
<Button Content="修改" Click="EditImage"/>
<Button Content="重置" Click="ReStoreImage"/>
</hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" Margin="0,128,0,23" LineStroke="Black" Grid.ColumnSpan="4"/>
<hc:UniformSpacingPanel Spacing="10" Margin="0,150,0,10" Grid.ColumnSpan="4">
<CheckBox x:Name="IconIsAdmin" Content="始终以管理员方式启动" IsChecked="{Binding AdminStartUp, Mode=OneWay}">
<CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
<GradientStop Color="#FF9EA3A6"/>
</LinearGradientBrush>
</CheckBox.Background>
</CheckBox>
</hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" Margin="0,200,0,-27" LineStroke="Black" Grid.ColumnSpan="4"/>
<hc:UniformSpacingPanel Spacing="10" Margin="0,218,0,-38" Grid.ColumnSpan="4">
<Button Content="保存" Command="hc:ControlCommands.Close" Click="SaveProperty" Margin="208,6,-208,-10"/>
</hc:UniformSpacingPanel>
</Grid>
<Button Width="22" Height="22" Command="hc:ControlCommands.Close" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,4,4,0"/>
</hc:SimplePanel>-->
</Border>

View File

@@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GeekDesk.Control.Other
{
/// <summary>
/// MenuGeometryDialogxaml.xaml 的交互逻辑
/// </summary>
public partial class MenuGeometryDialog
{
public MenuGeometryDialog()
{
InitializeComponent();
}
}
}

View File

@@ -7,28 +7,29 @@
xmlns:local="clr-namespace:GeekDesk.Control.UserControls.PannelCard" xmlns:local="clr-namespace:GeekDesk.Control.UserControls.PannelCard"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d" mc:Ignorable="d"
Background="AliceBlue" Background="Transparent"
d:DesignHeight="400" d:DesignWidth="500"> d:DesignHeight="400" d:DesignWidth="500">
<UserControl.Resources> <UserControl.Resources>
<cvt:UpdateTypeConvert x:Key="UpdateTypeConvert"/> <cvt:UpdateTypeConvert x:Key="UpdateTypeConvert"/>
</UserControl.Resources> </UserControl.Resources>
<Grid MouseDown="DragMove">
<hc:SimplePanel Margin="20,50,20,20" > <hc:SimplePanel Margin="20,50,20,20" >
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Top"> <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Top">
<Image Source="/Resource/Image/About.png" Width="400" Height="100"/> <Image Source="/Resource/Image/About.png" Width="400" Height="100"/>
<TextBlock x:Name="AppInfo" TextAlignment="Center" Text="Copyright © 2021 GeekDesk "/> <TextBlock x:Name="AppInfo" TextAlignment="Center" Text="Copyright © 2021 GeekDesk V"/>
<hc:UniformSpacingPanel Spacing="5" HorizontalAlignment="Center" Margin="10,10,0,0" VerticalAlignment="Center"> <hc:UniformSpacingPanel Spacing="5" HorizontalAlignment="Center" Margin="10,10,0,0" VerticalAlignment="Center">
<hc:Shield Subject=".net" Status=">=4.72" Margin="0,0,10,0" Color="#1182c3"/> <hc:Shield Subject=".net" Status=">=4.72" Margin="0,0,10,0" Color="#1182c3"/>
<hc:Shield Subject="IDE" Status="VS2019" Margin="0,0,10,0" Color="#1182c3"/> <hc:Shield Subject="IDE" Status="VS2019" Margin="0,0,10,0" Color="#1182c3"/>
<hc:Shield Subject="GitHub" Visibility="Visible" Status="Demo-liu" <hc:Shield Subject="GitHub" Visibility="Visible" Status="Star"
Command="hc:ControlCommands.OpenLink" Command="hc:ControlCommands.OpenLink"
CommandParameter="https://github.com/Demo-Liu/GeekDesk" CommandParameter="https://github.com/Demo-Liu/GeekDesk"
Margin="0,0,10,0" Color="#24292F"/> Margin="0,0,10,0" Color="#24292F"/>
<hc:Shield Subject="Gitee" Visibility="Visible" Status="Demo-liu" <hc:Shield Subject="Gitee" Visibility="Visible" Status="Star"
Command="hc:ControlCommands.OpenLink" Command="hc:ControlCommands.OpenLink"
CommandParameter="" CommandParameter="https://gitee.com/demo_liu/GeekDesk"
Margin="0,5,10,0" Color="#C71D23"/> Margin="0,0,10,0" Color="#C71D23"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
@@ -63,7 +64,7 @@
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<TextBlock Margin="0,20,0,0" FontSize="13" Width="200" TextAlignment="Center" Text="这是个人开发的程序,所有人可任意修改和免费使用(商用请联系作者)" TextWrapping="Wrap"/> <TextBlock Margin="0,20,0,0" FontSize="13" Width="200" TextAlignment="Center" Text="这是个人开发的程序,所有人可任意修改和免费使用(商用请联系作者)" TextWrapping="Wrap"/>
<hc:UniformSpacingPanel Spacing="10" Visibility="Visible" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,10,0,0"> <!--<hc:UniformSpacingPanel Spacing="10" Visibility="Visible" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,10,0,0">
<TextBlock Text="更新源:" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"/> <TextBlock Text="更新源:" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<RadioButton Margin="10,0,0,0" Background="{DynamicResource SecondaryRegionBrush}" <RadioButton Margin="10,0,0,0" Background="{DynamicResource SecondaryRegionBrush}"
Style="{StaticResource RadioButtonIcon}" Content="Gitee" Style="{StaticResource RadioButtonIcon}" Content="Gitee"
@@ -71,8 +72,10 @@
<RadioButton Margin="10,0,0,0" Background="{DynamicResource SecondaryRegionBrush}" <RadioButton Margin="10,0,0,0" Background="{DynamicResource SecondaryRegionBrush}"
Style="{StaticResource RadioButtonIcon}" Content="GitHub" Style="{StaticResource RadioButtonIcon}" Content="GitHub"
IsChecked="{Binding UpdateType, Mode=TwoWay, Converter={StaticResource UpdateTypeConvert}, ConverterParameter=2}"/> IsChecked="{Binding UpdateType, Mode=TwoWay, Converter={StaticResource UpdateTypeConvert}, ConverterParameter=2}"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>-->
</StackPanel> </StackPanel>
</hc:SimplePanel> </hc:SimplePanel>
</Grid>
</UserControl> </UserControl>

View File

@@ -31,5 +31,19 @@ namespace GeekDesk.Control.UserControls.Config
WeChatCode.Source = ImageUtil.Base64ToBitmapImage(Constants.WE_CHAT_CODE_IMG_BASE64); WeChatCode.Source = ImageUtil.Base64ToBitmapImage(Constants.WE_CHAT_CODE_IMG_BASE64);
ZFBCode.Source = ImageUtil.Base64ToBitmapImage(Constants.ZFB_CODE_IMG_BASE64); ZFBCode.Source = ImageUtil.Base64ToBitmapImage(Constants.ZFB_CODE_IMG_BASE64);
} }
/// <summary>
/// 移动窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Window.GetWindow(this).DragMove();
}
}
} }
} }

View File

@@ -6,17 +6,21 @@
xmlns:cvt="clr-namespace:GeekDesk.Converts" xmlns:cvt="clr-namespace:GeekDesk.Converts"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d" mc:Ignorable="d"
Background="AliceBlue" Background="Transparent"
d:DesignHeight="300" d:DesignWidth="450"> d:DesignHeight="300" d:DesignWidth="450">
<UserControl.Resources> <UserControl.Resources>
<cvt:HideTypeConvert x:Key="HideTypeConvert"/> <cvt:HideTypeConvert x:Key="HideTypeConvert"/>
</UserControl.Resources> </UserControl.Resources>
<hc:SimplePanel Margin="20"> <Grid Background="Transparent" MouseDown="DragMove"
<hc:UniformSpacingPanel Spacing="10" Margin="0,0,0,10" Grid.ColumnSpan="4"> >
<StackPanel Panel.ZIndex="1" hc:Growl.GrowlParent="True" hc:Growl.Token="HotKeyGrowl"></StackPanel>
<StackPanel Margin="10">
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<TextBlock Text="面板动作设置" VerticalAlignment="Center"/> <TextBlock Text="面板动作设置" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="30,26.394,0,-16.394" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<CheckBox x:Name="IconIsAdmin" Content="启动时显示主面板" IsChecked="{Binding StartedShowPanel}"> <CheckBox x:Name="IconIsAdmin" Content="启动时显示主面板" IsChecked="{Binding StartedShowPanel}">
<CheckBox.Background> <CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0"> <LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
@@ -26,7 +30,7 @@
</CheckBox> </CheckBox>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="30,50,0,-102.337" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<CheckBox Content="显示时追随鼠标位置" IsChecked="{Binding FollowMouse}"> <CheckBox Content="显示时追随鼠标位置" IsChecked="{Binding FollowMouse}">
<CheckBox.Background> <CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0"> <LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
@@ -35,10 +39,51 @@
</CheckBox.Background> </CheckBox.Background>
</CheckBox> </CheckBox>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="30,89.49,-30,-79.49" Grid.ColumnSpan="4">
<TextBlock Text="面板关闭方式" VerticalAlignment="Center" Margin="-26,0,26,0"/> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<CheckBox Content="鼠标中间呼出" Click="MouseMiddle_Changed" IsChecked="{Binding MouseMiddleShow}">
<CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
<GradientStop Color="#FF9EA3A6"/>
</LinearGradientBrush>
</CheckBox.Background>
</CheckBox>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="10,115,20,-102.337" Grid.ColumnSpan="4">
<hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<CheckBox Content="双击启动" IsChecked="{Binding DoubleOpen}">
<CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
<GradientStop Color="#FF9EA3A6"/>
</LinearGradientBrush>
</CheckBox.Background>
</CheckBox>
</hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<CheckBox Content="贴边隐藏" IsChecked="{Binding MarginHide}" Click="MarginHide_Changed">
<CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
<GradientStop Color="#FF9EA3A6"/>
</LinearGradientBrush>
</CheckBox.Background>
</CheckBox>
</hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<CheckBox Content="主窗口动画效果" IsChecked="{Binding AppAnimation}" Click="Animation_Checked">
<CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
<GradientStop Color="#FF9EA3A6"/>
</LinearGradientBrush>
</CheckBox.Background>
</CheckBox>
</hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,0" Grid.ColumnSpan="4">
<TextBlock Text="面板关闭方式" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<RadioButton Margin="10,0,0,0" Background="{DynamicResource SecondaryRegionBrush}" <RadioButton Margin="10,0,0,0" Background="{DynamicResource SecondaryRegionBrush}"
Style="{StaticResource RadioButtonIcon}" Content="失去焦点后" Style="{StaticResource RadioButtonIcon}" Content="失去焦点后"
IsChecked="{Binding AppHideType, Mode=TwoWay, Converter={StaticResource HideTypeConvert}, ConverterParameter=1}"/> IsChecked="{Binding AppHideType, Mode=TwoWay, Converter={StaticResource HideTypeConvert}, ConverterParameter=1}"/>
@@ -50,11 +95,11 @@
IsChecked="{Binding AppHideType, Mode=TwoWay, Converter={StaticResource HideTypeConvert}, ConverterParameter=3}"/> IsChecked="{Binding AppHideType, Mode=TwoWay, Converter={StaticResource HideTypeConvert}, ConverterParameter=3}"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="30,164.49,-30,-154.49" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,0" Grid.ColumnSpan="4">
<TextBlock Text="热键设置" VerticalAlignment="Center" Margin="-26,0,26,0"/> <TextBlock Text="热键设置" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="30,193,0,-180.337" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<TextBlock Text="主面板:" Width="55"/> <TextBlock Text="主面板:" VerticalAlignment="Center" Width="55"/>
<hc:TextBox HorizontalAlignment="Left" <hc:TextBox HorizontalAlignment="Left"
Tag="Main" Tag="Main"
VerticalAlignment="Top" VerticalAlignment="Top"
@@ -64,9 +109,9 @@
Text="{Binding HotkeyStr}" Text="{Binding HotkeyStr}"
KeyDown="HotKeyDown" KeyDown="HotKeyDown"
KeyUp="HotKeyUp" KeyUp="HotKeyUp"
Margin="12.967,-7.38,-12.967,0"/> />
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<!--<hc:UniformSpacingPanel Spacing="10" Margin="30,229,0,-216.337" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<TextBlock Text="新建待办:" Width="55"/> <TextBlock Text="新建待办:" Width="55"/>
<hc:TextBox HorizontalAlignment="Left" <hc:TextBox HorizontalAlignment="Left"
Tag="ToDo" Tag="ToDo"
@@ -77,9 +122,10 @@
Text="{Binding ToDoHotkeyStr}" Text="{Binding ToDoHotkeyStr}"
KeyDown="HotKeyDown" KeyDown="HotKeyDown"
KeyUp="HotKeyUp" KeyUp="HotKeyUp"
Margin="12.967,-7.38,-12.967,0"/> />
</hc:UniformSpacingPanel>--> </hc:UniformSpacingPanel>
<StackPanel hc:Growl.GrowlParent="True" hc:Growl.Token="HotKeyGrowl" VerticalAlignment="Top"/> </StackPanel>
</hc:SimplePanel> </Grid>
</UserControl> </UserControl>

View File

@@ -1,4 +1,6 @@
using GeekDesk.Control.Windows; using GeekDesk.Constant;
using GeekDesk.Control.Windows;
using GeekDesk.Thread;
using GeekDesk.Util; using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using HandyControl.Data; using HandyControl.Data;
@@ -19,6 +21,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using System.Windows.Navigation; using System.Windows.Navigation;
using System.Windows.Shapes; using System.Windows.Shapes;
using static GeekDesk.Util.GlobalHotKey;
namespace GeekDesk.Control.UserControls.Config namespace GeekDesk.Control.UserControls.Config
{ {
@@ -28,9 +31,9 @@ namespace GeekDesk.Control.UserControls.Config
public partial class MotionControl : UserControl public partial class MotionControl : UserControl
{ {
public static bool hotkeyFinished = true; //热键设置结束 public static bool hotkeyFinished = true; //热键设置结束
private static KeyEventArgs prevKeyTemp; //上一个按键 private Key prevKeyTemp = Key.None; //上一个按键
private static List<KeyEventArgs> keysTemp = new List<KeyEventArgs>();//存储一次快捷键集合 private readonly List<KeyEventArgs> keysTemp = new List<KeyEventArgs>();//存储一次快捷键集合
private static AppConfig appConfig = MainWindow.appData.AppConfig; private readonly AppConfig appConfig = MainWindow.appData.AppConfig;
public MotionControl() public MotionControl()
{ {
@@ -47,13 +50,19 @@ namespace GeekDesk.Control.UserControls.Config
{ {
string tag = (sender as TextBox).Tag.ToString(); string tag = (sender as TextBox).Tag.ToString();
Key downKey = e.Key;
if (downKey == Key.System)
{
downKey = e.SystemKey;
}
bool main = false; bool main = false;
if ("Main".Equals(tag)) if ("Main".Equals(tag))
{ {
main = true; main = true;
} }
if (!e.IsRepeat) if (prevKeyTemp == Key.None || prevKeyTemp!=downKey)
{ {
if (hotkeyFinished) if (hotkeyFinished)
{ {
@@ -69,25 +78,24 @@ namespace GeekDesk.Control.UserControls.Config
appConfig.ToDoHotkeyModifiers = 0; appConfig.ToDoHotkeyModifiers = 0;
} }
hotkeyFinished = false; hotkeyFinished = false;
} }
//首次按下按键 //首次按下按键
if ((main && (appConfig.HotkeyStr == null || appConfig.HotkeyStr.Length == 0)) if ((main && (appConfig.HotkeyStr == null || appConfig.HotkeyStr.Length == 0))
|| (!main && (appConfig.ToDoHotkeyStr == null || appConfig.ToDoHotkeyStr.Length == 0))) || (!main && (appConfig.ToDoHotkeyStr == null || appConfig.ToDoHotkeyStr.Length == 0)))
{ {
if (CheckModifierKeys(e)) if (CheckModifierKeys(downKey))
{ {
//辅助键 //辅助键
if (main) if (main)
{ {
appConfig.HotkeyStr = GetKeyName(e); appConfig.HotkeyStr = GetKeyName(downKey);
appConfig.HotkeyModifiers = GetModifierKeys(e); appConfig.HotkeyModifiers = GetModifierKeys(downKey);
} else } else
{ {
appConfig.ToDoHotkeyStr = GetKeyName(e); appConfig.ToDoHotkeyStr = GetKeyName(downKey);
appConfig.ToDoHotkeyModifiers = GetModifierKeys(e); appConfig.ToDoHotkeyModifiers = GetModifierKeys(downKey);
} }
prevKeyTemp = e; prevKeyTemp = downKey;
keysTemp.Add(e); keysTemp.Add(e);
} }
} }
@@ -95,44 +103,43 @@ namespace GeekDesk.Control.UserControls.Config
{ {
//非首次按下 需要判断前一个键值是否为辅助键 //非首次按下 需要判断前一个键值是否为辅助键
if (CheckModifierKeys(prevKeyTemp) if (CheckModifierKeys(prevKeyTemp)
&& ((e.Key >= Key.A && e.Key <= Key.Z) && ((downKey >= Key.A && downKey <= Key.Z)
|| (e.Key >= Key.F1 && e.Key <= Key.F12) || (downKey >= Key.F1 && downKey <= Key.F12)
|| (e.Key >= Key.D0 && e.Key <= Key.D9))) || (downKey >= Key.D0 && downKey <= Key.D9)))
{ {
if (main) if (main)
{ {
appConfig.Hotkey = e.Key; appConfig.Hotkey = downKey;
appConfig.HotkeyStr += e.Key.ToString(); appConfig.HotkeyStr += downKey.ToString();
} else } else
{ {
appConfig.ToDoHotkey = e.Key; appConfig.ToDoHotkey = downKey;
appConfig.ToDoHotkeyStr += e.Key.ToString(); appConfig.ToDoHotkeyStr += downKey.ToString();
} }
prevKeyTemp = e; prevKeyTemp = downKey;
keysTemp.Add(e); keysTemp.Add(e);
} }
else if (CheckModifierKeys(e)) else if (CheckModifierKeys(downKey))
{ {
if (main) if (main)
{ {
appConfig.HotkeyStr += GetKeyName(e); appConfig.HotkeyStr += GetKeyName(downKey);
appConfig.HotkeyModifiers |= GetModifierKeys(e); appConfig.HotkeyModifiers |= GetModifierKeys(downKey);
} else } else
{ {
appConfig.ToDoHotkeyStr += GetKeyName(e); appConfig.ToDoHotkeyStr += GetKeyName(downKey);
appConfig.ToDoHotkeyModifiers |= GetModifierKeys(e); appConfig.ToDoHotkeyModifiers |= GetModifierKeys(downKey);
} }
prevKeyTemp = e; prevKeyTemp = downKey;
keysTemp.Add(e); keysTemp.Add(e);
} }
} }
} }
} }
private string GetKeyName(KeyEventArgs e) private string GetKeyName(Key key)
{ {
Key key = e.Key;
if (key == Key.LeftCtrl || key == Key.RightCtrl) if (key == Key.LeftCtrl || key == Key.RightCtrl)
{ {
return "Ctrl + "; return "Ctrl + ";
@@ -148,12 +155,10 @@ namespace GeekDesk.Control.UserControls.Config
{ {
return "Alt + "; return "Alt + ";
} }
} }
private HotkeyModifiers GetModifierKeys(KeyEventArgs e) private HotkeyModifiers GetModifierKeys(Key key)
{ {
Key key = e.Key;
if (key == Key.LeftCtrl || key == Key.RightCtrl) if (key == Key.LeftCtrl || key == Key.RightCtrl)
{ {
return HotkeyModifiers.MOD_CONTROL; return HotkeyModifiers.MOD_CONTROL;
@@ -172,9 +177,8 @@ namespace GeekDesk.Control.UserControls.Config
} }
} }
private bool CheckModifierKeys(KeyEventArgs e) private bool CheckModifierKeys(Key key)
{ {
Key key = e.Key;
return key == Key.LeftCtrl || key == Key.RightCtrl return key == Key.LeftCtrl || key == Key.RightCtrl
|| key == Key.LWin || key == Key.RWin || key == Key.LWin || key == Key.RWin
|| key == Key.LeftShift || key == Key.RightShift || key == Key.LeftShift || key == Key.RightShift
@@ -206,20 +210,23 @@ namespace GeekDesk.Control.UserControls.Config
if (allKeyUp && !hotkeyFinished) if (allKeyUp && !hotkeyFinished)
{ {
keysTemp.Clear(); keysTemp.Clear();
prevKeyTemp = Key.None;
hotkeyFinished = true; hotkeyFinished = true;
if (main) if (main)
{ {
if (MainWindow.hotKeyId != -1) if (MainWindow.hotKeyId != -1)
{ {
Hotkey.UnRegist(new WindowInteropHelper(MainWindow.mainWindow).Handle, Hotkey.keymap[MainWindow.hotKeyId]); //Hotkey.UnRegist(new WindowInteropHelper(MainWindow.mainWindow).Handle, Hotkey.keymap[MainWindow.hotKeyId]);
GlobalHotKey.Dispose(MainWindow.hotKeyId);
} }
MainWindow.RegisterHotKey(false); MainWindow.RegisterHotKey(false);
} else } else
{ {
if (MainWindow.toDoHotKeyId != -1) if (MainWindow.toDoHotKeyId != -1)
{ {
Hotkey.UnRegist(new WindowInteropHelper(MainWindow.toDoInfoWindow).Handle, Hotkey.keymap[MainWindow.toDoHotKeyId]); //Hotkey.UnRegist(new WindowInteropHelper(MainWindow.toDoInfoWindow).Handle, Hotkey.keymap[MainWindow.toDoHotKeyId]);
GlobalHotKey.Dispose(MainWindow.toDoHotKeyId);
} }
MainWindow.RegisterCreateToDoHotKey(false); MainWindow.RegisterCreateToDoHotKey(false);
} }
@@ -229,66 +236,56 @@ namespace GeekDesk.Control.UserControls.Config
} }
} }
//private void ShowApp(MainWindow mainWindow) /// <summary>
//{ /// 移动窗口
// if (appConfig.FollowMouse) /// </summary>
// { /// <param name="sender"></param>
// ShowAppAndFollowMouse(mainWindow); /// <param name="e"></param>
// } private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
// else {
// { if (e.LeftButton == MouseButtonState.Pressed)
// this.Visibility = Visibility.Visible; {
// } Window.GetWindow(this).DragMove();
// Keyboard.Focus(this); }
//} }
///// <summary> private void MarginHide_Changed(object sender, RoutedEventArgs e)
///// 随鼠标位置显示面板 (鼠标始终在中间) {
///// </summary> if (appConfig.MarginHide)
//private void ShowAppAndFollowMouse(MainWindow mainWindow) {
//{ MarginHide.StartHide();
// //获取鼠标位置 } else
// System.Windows.Point p = MouseUtil.GetMousePosition(); {
// double left = SystemParameters.VirtualScreenLeft; MarginHide.StopHide();
// double top = SystemParameters.VirtualScreenTop; }
// double width = SystemParameters.VirtualScreenWidth; }
// double height = SystemParameters.VirtualScreenHeight;
// double right = width - Math.Abs(left); private void Animation_Checked(object sender, RoutedEventArgs e)
// double bottom = height - Math.Abs(top); {
if (MainWindow.mainWindow.Visibility == Visibility.Collapsed)
{
// if (p.X - mainWindow.Width / 2 < left) MainWindow.mainWindow.Visibility = Visibility.Visible;
// { // 执行一下动画 防止太过突兀
// //判断是否在最左边缘 MainWindow.FadeStoryBoard(0, (int)CommonEnum.WINDOW_ANIMATION_TIME, Visibility.Collapsed);
// mainWindow.Left = left; }
// } }
// else if (p.X + mainWindow.Width / 2 > right)
// {
// //判断是否在最右边缘 /// <summary>
// mainWindow.Left = right - mainWindow.Width; /// 鼠标中键呼出 change
// } /// </summary>
// else /// <param name="sender"></param>
// { /// <param name="e"></param>
// mainWindow.Left = p.X - mainWindow.Width / 2; private void MouseMiddle_Changed(object sender, RoutedEventArgs e)
// } {
if (appConfig.MouseMiddleShow)
{
// if (p.Y - mainWindow.Height / 2 < top) MouseHookThread.MiddleHook();
// { } else
// //判断是否在最上边缘 {
// mainWindow.Top = top; MouseHookThread.Dispose();
// } }
// else if (p.Y + mainWindow.Height / 2 > bottom) }
// {
// //判断是否在最下边缘
// mainWindow.Top = bottom - mainWindow.Height;
// }
// else
// {
// mainWindow.Top = p.Y - mainWindow.Height / 2;
// }
// mainWindow.Visibility = Visibility.Visible;
//}
} }
} }

View File

@@ -7,13 +7,14 @@
xmlns:local="clr-namespace:GeekDesk.Control.UserControls.PannelCard" xmlns:local="clr-namespace:GeekDesk.Control.UserControls.PannelCard"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d" mc:Ignorable="d"
Background="AliceBlue" Background="Transparent"
d:DesignHeight="400" d:DesignWidth="500" d:DesignHeight="400" d:DesignWidth="500"
> >
<UserControl.Resources> <UserControl.Resources>
<cvt:UpdateTypeConvert x:Key="UpdateTypeConvert"/> <cvt:UpdateTypeConvert x:Key="UpdateTypeConvert"/>
</UserControl.Resources> </UserControl.Resources>
<Grid MouseDown="DragMove" Background="Transparent">
<hc:SimplePanel Margin="20" > <hc:SimplePanel Margin="20" >
<StackPanel > <StackPanel >
<TextBlock Text="程序设置" /> <TextBlock Text="程序设置" />
@@ -54,5 +55,7 @@
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
</StackPanel> </StackPanel>
</hc:SimplePanel> </hc:SimplePanel>
</Grid>
</UserControl> </UserControl>

View File

@@ -33,5 +33,18 @@ namespace GeekDesk.Control.UserControls.Config
AppConfig appConfig = MainWindow.appData.AppConfig; AppConfig appConfig = MainWindow.appData.AppConfig;
RegisterUtil.SetSelfStarting(appConfig.SelfStartUp, Constants.MY_NAME); RegisterUtil.SetSelfStarting(appConfig.SelfStartUp, Constants.MY_NAME);
} }
/// <summary>
/// 移动窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Window.GetWindow(this).DragMove();
}
}
} }
} }

View File

@@ -6,16 +6,20 @@
xmlns:local="clr-namespace:GeekDesk.Control.UserControls.Config" xmlns:local="clr-namespace:GeekDesk.Control.UserControls.Config"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d" mc:Ignorable="d"
Background="AliceBlue" Background="Transparent"
d:DesignHeight="380" d:DesignWidth="450"> d:DesignHeight="500" d:DesignWidth="450">
<hc:SimplePanel Margin="20">
<hc:UniformSpacingPanel Spacing="10" Margin="0,0,-40,-12" Grid.ColumnSpan="4">
<Grid>
<Grid MouseDown="DragMove" Background="Transparent">
<StackPanel Margin="20" >
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<TextBlock Text="背景图片" VerticalAlignment="Center"/> <TextBlock Text="背景图片" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="19,20,-59,-31.5" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="20,0,0,0" Grid.ColumnSpan="4">
<TextBlock Text="图片路径:" VerticalAlignment="Center"/> <TextBlock Text="图片路径:" VerticalAlignment="Center" Margin="0,5,0,0"/>
<TextBlock Text="{Binding BacImgName}" Width="200" <TextBlock Text="{Binding BacImgName}" Width="200"
Margin="0,5,0,0"
VerticalAlignment="Center" VerticalAlignment="Center"
hc:Poptip.HitMode="None" hc:Poptip.HitMode="None"
hc:Poptip.IsOpen="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" hc:Poptip.IsOpen="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}"
@@ -23,9 +27,10 @@
hc:Poptip.Placement="TopLeft" hc:Poptip.Placement="TopLeft"
/> />
<Button Content="修改" Click="BGButton_Click"/> <Button Content="修改" Click="BGButton_Click"/>
<Button Content="默认" Click="DefaultButton_Click"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="19,60,11,-36.433" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="20,0,0,0" Grid.ColumnSpan="4">
<CheckBox x:Name="IconIsAdmin" Content="毛玻璃效果" IsChecked="{Binding BlurEffect}"> <CheckBox x:Name="IconIsAdmin" Content="毛玻璃效果" IsChecked="{Binding BlurEffect}">
<CheckBox.Background> <CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0"> <LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
@@ -35,16 +40,26 @@
</CheckBox> </CheckBox>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:Divider LineStrokeDashArray="3,3" Margin="0,91.5,0,34.5" LineStroke="Black" Grid.ColumnSpan="4"/> <hc:UniformSpacingPanel Spacing="10" Margin="20,5,0,0" Grid.ColumnSpan="4">
<CheckBox x:Name="BarIcon" Content="显示托盘图标" IsChecked="{Binding ShowBarIcon}">
<CheckBox.Background>
<LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
<GradientStop Color="#FF9EA3A6"/>
</LinearGradientBrush>
</CheckBox.Background>
</CheckBox>
</hc:UniformSpacingPanel>
<StackPanel Margin="0,30,0,0"> <hc:Divider LineStrokeDashArray="3,3" LineStroke="Black" Grid.ColumnSpan="4"/>
<hc:UniformSpacingPanel Spacing="10" Margin="0,80,-40,-89.5" Grid.ColumnSpan="4">
<StackPanel>
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<TextBlock Text="托盘不透明度" VerticalAlignment="Center"/> <TextBlock Text="托盘不透明度" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,110,-40,-122" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<hc:PreviewSlider Value="{Binding CardOpacity}" <hc:PreviewSlider Value="{Binding CardOpacity}"
Maximum="100" Maximum="100"
Margin="0,-12,-313.5,19.5" Width="350"
> >
<hc:PreviewSlider.PreviewContent> <hc:PreviewSlider.PreviewContent>
<Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/> <Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/>
@@ -53,13 +68,13 @@
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,135,-40,-161.626" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,0" Grid.ColumnSpan="4">
<TextBlock Text="背景图片不透明度" VerticalAlignment="Center"/> <TextBlock Text="背景图片不透明度" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,155,-40,-183" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<hc:PreviewSlider Value="{Binding BgOpacity}" <hc:PreviewSlider Value="{Binding BgOpacity}"
Maximum="100" Maximum="100"
Margin="0,0,-313.5,7.5" Width="350"
> >
<hc:PreviewSlider.PreviewContent> <hc:PreviewSlider.PreviewContent>
<Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/> <Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/>
@@ -68,14 +83,14 @@
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,195,-40,-208.813" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,0" Grid.ColumnSpan="4">
<TextBlock Text="主面板不透明度" VerticalAlignment="Center"/> <TextBlock Text="主面板不透明度" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,215,-40,-241" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<hc:PreviewSlider Value="{Binding PannelOpacity}" <hc:PreviewSlider Value="{Binding PannelOpacity}"
Minimum="50" Minimum="50"
Maximum="100" Maximum="100"
Margin="0,0,-313.5,7.5" Width="350"
> >
<hc:PreviewSlider.PreviewContent> <hc:PreviewSlider.PreviewContent>
<Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/> <Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/>
@@ -83,13 +98,30 @@
</hc:PreviewSlider> </hc:PreviewSlider>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,245,-40,-279.313" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,0" Grid.ColumnSpan="4">
<TextBlock Text="主面板圆角大小" VerticalAlignment="Center"/> <TextBlock Text="主面板圆角大小" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,265,-40,-321" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4">
<hc:PreviewSlider Value="{Binding PannelCornerRadius}" <hc:PreviewSlider Value="{Binding PannelCornerRadius}"
Maximum="25" Maximum="25"
Margin="0,0,-313.5,7.5" Width="350"
>
<hc:PreviewSlider.PreviewContent>
<Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/>
</hc:PreviewSlider.PreviewContent>
</hc:PreviewSlider>
</hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,0" Grid.ColumnSpan="4">
<TextBlock Text="图标大小" VerticalAlignment="Center"/>
</hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="10,5,0,0" Grid.ColumnSpan="4"
Background="#00FFFFFF"
PreviewMouseLeftButtonDown="PreviewSlider_MouseLeftButtonUp"
>
<hc:PreviewSlider Value="{Binding ImageWidth, Mode=TwoWay}"
Minimum="40"
Maximum="60"
Width="350"
> >
<hc:PreviewSlider.PreviewContent> <hc:PreviewSlider.PreviewContent>
<Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/> <Label Style="{StaticResource LabelPrimary}" Content="{Binding Path=(hc:PreviewSlider.PreviewPosition),RelativeSource={RelativeSource Self}}" ContentStringFormat="#0"/>
@@ -97,6 +129,24 @@
</hc:PreviewSlider> </hc:PreviewSlider>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
</StackPanel> </StackPanel>
<hc:Divider LineStrokeDashArray="3,3" LineStroke="Black" Grid.ColumnSpan="4"/>
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<TextBlock VerticalAlignment="Center" Text="图标字体颜色:" />
<TextBlock VerticalAlignment="Center" Text="{Binding TextColor}" Width="100"/>
<Button Content="选择" Click="ColorButton_Click"/>
</hc:UniformSpacingPanel>
</StackPanel>
</Grid>
<StackPanel x:Name="ColorPanel" Visibility="Collapsed" VerticalAlignment="Center">
<StackPanel.Background>
<SolidColorBrush Color="AliceBlue" Opacity="0"/>
</StackPanel.Background>
<hc:ColorPicker
Name="ColorPicker"
Canceled="ColorPicker_Canceled"
SelectedColorChanged="ColorPicker_SelectedColorChanged"/>
</StackPanel>
</Grid>
</hc:SimplePanel>
</UserControl> </UserControl>

View File

@@ -1,8 +1,10 @@
using GeekDesk.Util; using GeekDesk.Constant;
using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using Microsoft.Win32; using Microsoft.Win32;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -23,6 +25,8 @@ namespace GeekDesk.Control.UserControls.Config
/// </summary> /// </summary>
public partial class ThemeControl : System.Windows.Controls.UserControl public partial class ThemeControl : System.Windows.Controls.UserControl
{ {
private static AppConfig appConfig = MainWindow.appData.AppConfig;
public ThemeControl() public ThemeControl()
{ {
InitializeComponent(); InitializeComponent();
@@ -35,7 +39,6 @@ namespace GeekDesk.Control.UserControls.Config
/// <param name="e"></param> /// <param name="e"></param>
private void BGButton_Click(object sender, RoutedEventArgs e) private void BGButton_Click(object sender, RoutedEventArgs e)
{ {
AppConfig appConfig = MainWindow.appData.AppConfig;
try try
{ {
@@ -50,11 +53,95 @@ namespace GeekDesk.Control.UserControls.Config
appConfig.BacImgName = ofd.FileName; appConfig.BacImgName = ofd.FileName;
} }
} }
catch (Exception) catch (Exception e1)
{ {
HandyControl.Controls.Growl.WarningGlobal("修改背景失败,已重置为默认背景!"); HandyControl.Controls.Growl.WarningGlobal("修改背景失败,已重置为默认背景!");
LogUtil.WriteErrorLog(e1, "修改背景失败!");
} }
} }
private void DefaultButton_Click(object sender, RoutedEventArgs e)
{
try
{
appConfig.BitmapImage = ImageUtil.Base64ToBitmapImage(Constants.DEFAULT_BAC_IMAGE_BASE64);
appConfig.BacImgName = "系统默认";
}
catch (Exception e1)
{
HandyControl.Controls.Growl.WarningGlobal("修改背景失败,已重置为默认背景!");
LogUtil.WriteErrorLog(e1, "修改默认背景失败!");
}
}
private void ColorButton_Click(object sender, RoutedEventArgs e)
{
ColorPanel.Visibility = Visibility.Visible;
}
private void ColorPicker_Canceled(object sender, EventArgs e)
{
ColorPanel.Visibility = Visibility.Collapsed;
}
private void ColorPicker_SelectedColorChanged(object sender, HandyControl.Data.FunctionEventArgs<Color> e)
{
SolidColorBrush scb = ColorPicker.SelectedBrush;
appConfig.TextColor = scb.ToString();
ColorPanel.Visibility = Visibility.Collapsed;
}
/// <summary>
/// 移动窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Window.GetWindow(this).DragMove();
}
}
private void PreviewSlider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
CheckButtonUpClass cbu = new CheckButtonUpClass
{
e = e
};
System.Threading.ThreadStart ts = new System.Threading.ThreadStart(cbu.CheckButtonUp);
System.Threading.Thread t = new System.Threading.Thread(ts);
t.Start();
}
private class CheckButtonUpClass
{
public MouseButtonEventArgs e;
public void CheckButtonUp()
{
while (true)
{
if (e.LeftButton == MouseButtonState.Released)
{
App.Current.Dispatcher.Invoke((Action)(() =>
{
AppData appData = MainWindow.appData;
ObservableCollection<IconInfo> selectIcons = appData.AppConfig.SelectedMenuIcons;
appData.AppConfig.SelectedMenuIcons = null;
appData.AppConfig.SelectedMenuIcons = selectIcons;
}));
return;
}
System.Threading.Thread.Sleep(50);
}
}
}
} }
} }

View File

@@ -6,9 +6,10 @@
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:local="clr-namespace:GeekDesk.Control.UserControls.IconFont" xmlns:local="clr-namespace:GeekDesk.Control.UserControls.IconFont"
mc:Ignorable="d" mc:Ignorable="d"
Background="#00FFFFFF"
> >
<WrapPanel HorizontalAlignment="Center" VerticalAlignment="Top"> <WrapPanel HorizontalAlignment="Center" VerticalAlignment="Top" Background="Transparent">
<ListBox x:Name="IconListBox" ItemsSource="{Binding Iconfonts}" BorderThickness="0" Background="AliceBlue"> <ListBox x:Name="IconListBox" ItemsSource="{Binding Iconfonts}" BorderThickness="0" Background="Transparent">
<ListBox.ItemsPanel> <ListBox.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" Background="Transparent"/> <WrapPanel Orientation="Horizontal" Background="Transparent"/>

View File

@@ -13,13 +13,14 @@
<!--左侧栏样式动画--> <!--左侧栏样式动画-->
<Style x:Key="MenuStyle" TargetType="ListBoxItem" BasedOn="{StaticResource ListBoxItemBaseStyle}"> <Style x:Key="MenuStyle" TargetType="ListBoxItem" BasedOn="{StaticResource ListBoxItemBaseStyle}">
<Setter Property="FontSize" Value="15"/> <Setter Property="FontSize" Value="16"/>
<Setter Property="Margin" Value="0,0,0,1"/> <Setter Property="Margin" Value="0,0,0,1"/>
<Setter Property="Background"> <Setter Property="Background">
<Setter.Value> <Setter.Value>
<SolidColorBrush Opacity="0"/> <SolidColorBrush Opacity="0"/>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<EventSetter Event="MouseLeftButtonDown" Handler="MenuClick"/> <EventSetter Event="MouseLeftButtonDown" Handler="MenuClick"/>
<EventSetter Event="MouseRightButtonDown" Handler="MenuClick"/> <EventSetter Event="MouseRightButtonDown" Handler="MenuClick"/>
<Style.Triggers> <Style.Triggers>
@@ -30,8 +31,8 @@
</MultiTrigger.Conditions> </MultiTrigger.Conditions>
<MultiTrigger.EnterActions> <MultiTrigger.EnterActions>
<BeginStoryboard> <BeginStoryboard>
<Storyboard> <Storyboard Timeline.DesiredFrameRate="60">
<DoubleAnimation To="15" Duration="0:0:0.5" Storyboard.TargetProperty="FontSize"/> <DoubleAnimation To="16" Duration="0:0:0.2" Storyboard.TargetProperty="FontSize"/>
</Storyboard> </Storyboard>
</BeginStoryboard> </BeginStoryboard>
</MultiTrigger.EnterActions> </MultiTrigger.EnterActions>
@@ -43,13 +44,24 @@
</BeginStoryboard> </BeginStoryboard>
</MultiTrigger.ExitActions> </MultiTrigger.ExitActions>
</MultiTrigger> </MultiTrigger>
<!--<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FFE4DBDB"/> <Trigger Property="IsMouseOver" Value="True">
</Trigger>--> <Setter Property="Background" Value="#FFECECEC"/>
<Trigger Property="IsSelected" Value="true"> </Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#FFECECEC"/> <Setter Property="Background" Value="#FFECECEC"/>
<Setter Property="Foreground" Value="Black"/> <Setter Property="Foreground" Value="Black"/>
</Trigger> </Trigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsEdit}" Value="True"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="Transparent"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
<cvt:MenuWidthConvert x:Key="MenuWidthConvert"/> <cvt:MenuWidthConvert x:Key="MenuWidthConvert"/>
@@ -76,6 +88,7 @@
</hc:Card.ContextMenu> </hc:Card.ContextMenu>
<WrapPanel Orientation="Horizontal"> <WrapPanel Orientation="Horizontal">
<ListBox x:Name="MenuListBox" <ListBox x:Name="MenuListBox"
Padding="2,3,0,2"
ItemsSource="{Binding MenuList}" ItemsSource="{Binding MenuList}"
Tag="{Binding AppConfig.MenuCardWidth}" Tag="{Binding AppConfig.MenuCardWidth}"
BorderThickness="0" Foreground="{x:Null}" BorderThickness="0" Foreground="{x:Null}"
@@ -103,21 +116,25 @@
<ListBox.ItemsPanel> <ListBox.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<DraggAnimatedPanel:DraggAnimatedPanel ItemsHeight="30" ItemsWidth="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBox},AncestorLevel=1},Path=Tag, Mode=TwoWay, Converter={StaticResource MenuWidthConvert}}" HorizontalAlignment="Center" VerticalAlignment="Top" SwapCommand="{Binding SwapCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/> <DraggAnimatedPanel:DraggAnimatedPanel ItemsHeight="33" ItemsWidth="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBox},AncestorLevel=1},Path=Tag, Mode=TwoWay, Converter={StaticResource MenuWidthConvert}, ConverterParameter=10}" HorizontalAlignment="Center" VerticalAlignment="Top" SwapCommand="{Binding SwapCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
</ItemsPanelTemplate> </ItemsPanelTemplate>
</ListBox.ItemsPanel> </ListBox.ItemsPanel>
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate> <DataTemplate>
<StackPanel MouseLeftButtonDown="MenuClick" MouseRightButtonDown="MenuClick" Tag="{Binding}"> <StackPanel MouseLeftButtonDown="MenuClick" MouseRightButtonDown="MenuClick" Tag="{Binding}">
<hc:TextBox Text="{Binding Path=MenuName, Mode=TwoWay}" <TextBox Text="{Binding Path=MenuName, Mode=TwoWay}"
HorizontalAlignment="Left" HorizontalAlignment="Left"
Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBox},AncestorLevel=1},Path=Tag, Mode=TwoWay, Converter={StaticResource MenuWidthConvert}}" Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBox},AncestorLevel=1},Path=Tag, Mode=TwoWay, Converter={StaticResource MenuWidthConvert}, ConverterParameter=35}"
FontSize="15" FontSize="16"
Height="28"
VerticalAlignment="Center"
TextAlignment="Left" TextAlignment="Left"
LostFocus="LostFocusOrEnterDown" LostFocus="LostFocusOrEnterDown"
KeyDown="LostFocusOrEnterDown" KeyDown="LostFocusOrEnterDown"
Tag="{Binding}" Tag="{Binding}"
Padding="2"
BorderThickness="0"
IsVisibleChanged="MenuEditWhenVisibilityChanged" IsVisibleChanged="MenuEditWhenVisibilityChanged"
Visibility="{Binding MenuEdit}"/> Visibility="{Binding MenuEdit}"/>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">

View File

@@ -28,11 +28,11 @@ namespace GeekDesk.Control.UserControls.PannelCard
if (appData.AppConfig.SelectedMenuIndex >= appData.MenuList.Count || appData.AppConfig.SelectedMenuIndex == -1) if (appData.AppConfig.SelectedMenuIndex >= appData.MenuList.Count || appData.AppConfig.SelectedMenuIndex == -1)
{ {
appData.AppConfig.SelectedMenuIcons = appData.MenuList[0].IconList; appData.AppConfig.SelectedMenuIcons = appData.MenuList[0].IconList;
} else }
else
{ {
appData.AppConfig.SelectedMenuIcons = appData.MenuList[appData.AppConfig.SelectedMenuIndex].IconList; appData.AppConfig.SelectedMenuIcons = appData.MenuList[appData.AppConfig.SelectedMenuIndex].IconList;
} }
} }
DelegateCommand<int[]> _swap; DelegateCommand<int[]> _swap;
@@ -204,11 +204,13 @@ namespace GeekDesk.Control.UserControls.PannelCard
private void menus_SelectionChanged(object sender, SelectionChangedEventArgs e) private void menus_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
appData.AppConfig.SelectedMenuIcons = null;
//设置对应菜单的图标列表 //设置对应菜单的图标列表
if (MenuListBox.SelectedIndex == -1) if (MenuListBox.SelectedIndex == -1)
{ {
appData.AppConfig.SelectedMenuIcons = appData.MenuList[appData.MenuList.Count - 1].IconList; appData.AppConfig.SelectedMenuIcons = appData.MenuList[appData.MenuList.Count - 1].IconList;
} else }
else
{ {
appData.AppConfig.SelectedMenuIcons = appData.MenuList[MenuListBox.SelectedIndex].IconList; appData.AppConfig.SelectedMenuIcons = appData.MenuList[MenuListBox.SelectedIndex].IconList;
} }

View File

@@ -8,15 +8,17 @@
xmlns:cvt="clr-namespace:GeekDesk.Converts" xmlns:cvt="clr-namespace:GeekDesk.Converts"
xmlns:DraggAnimatedPanel="clr-namespace:DraggAnimatedPanel" xmlns:DraggAnimatedPanel="clr-namespace:DraggAnimatedPanel"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"> d:DesignHeight="450" d:DesignWidth="800"
>
<UserControl.Resources> <UserControl.Resources>
<!--右侧栏样式动画--> <!--右侧栏样式动画-->
<Style x:Key="ImageStyle" TargetType="Image"> <Style x:Key="ImageStyle" TargetType="Image">
<Setter Property="Width" Value="{Binding ImageWidth}"/> <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImageWidth, Mode=OneWay}"/>
<Setter Property="Height" Value="{Binding ImageHeight}"/> <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImageHeight, Mode=OneWay}"/>
<Setter Property="Source" Value="{Binding BitmapImage}"/> <Setter Property="Source" Value="{Binding BitmapImage}"/>
</Style> </Style>
<Style x:Key="MyListBoxItemStyle" TargetType="{x:Type ListBoxItem}"> <Style x:Key="MyListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}"> <ControlTemplate TargetType="{x:Type ListBoxItem}">
@@ -28,10 +30,8 @@
</Setter> </Setter>
</Style> </Style>
<cvt:MenuWidthConvert x:Key="MenuWidthConvert"/>
<cvt:OpcityConvert x:Key="OpcityConvert"/> <cvt:OpcityConvert x:Key="OpcityConvert"/>
</UserControl.Resources> </UserControl.Resources>
<!--右侧栏--> <!--右侧栏-->
<hc:Card AllowDrop="True" <hc:Card AllowDrop="True"
Drop="Wrap_Drop" Drop="Wrap_Drop"
@@ -44,18 +44,28 @@
<hc:Card.BorderBrush> <hc:Card.BorderBrush>
<SolidColorBrush Color="#FFFFFFFF" Opacity="0"/> <SolidColorBrush Color="#FFFFFFFF" Opacity="0"/>
</hc:Card.BorderBrush> </hc:Card.BorderBrush>
<WrapPanel Orientation="Horizontal"> <hc:Card.ContextMenu>
<ContextMenu Width="200">
<MenuItem Header="添加URL项目" Click="AddUrlIcon"/>
<MenuItem Header="添加系统项目" Click="AddSystemIcon"/>
</ContextMenu>
</hc:Card.ContextMenu>
<WrapPanel Orientation="Horizontal" VirtualizingPanel.VirtualizationMode="Recycling"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsContainerVirtualizable="True"
>
<ListBox x:Name="IconListBox" ItemsSource="{Binding AppConfig.SelectedMenuIcons, Mode=TwoWay}" <ListBox x:Name="IconListBox" ItemsSource="{Binding AppConfig.SelectedMenuIcons, Mode=TwoWay}"
BorderThickness="0" BorderThickness="0"
Padding="0,10,0,0"
> >
<ListBox.Background> <ListBox.Background>
<SolidColorBrush Opacity="0"/> <SolidColorBrush Opacity="0"/>
</ListBox.Background> </ListBox.Background>
<ListBox.ItemsPanel> <ListBox.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<DraggAnimatedPanel:DraggAnimatedPanel ItemsHeight="110" <DraggAnimatedPanel:DraggAnimatedPanel Background="#00FFFFFF"
ItemsWidth="110" ItemsWidth="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImgPanelWidth, Mode=OneWay}"
Background="#00FFFFFF" ItemsHeight="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImgPanelHeight, Mode=OneWay}"
HorizontalAlignment="Center" HorizontalAlignment="Center"
SwapCommand="{Binding SwapCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/> SwapCommand="{Binding SwapCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
</ItemsPanelTemplate> </ItemsPanelTemplate>
@@ -65,6 +75,8 @@
<ContextMenu x:Key="IconDialog" Width="200"> <ContextMenu x:Key="IconDialog" Width="200">
<MenuItem Header="管理员方式运行" Click="IconAdminStart" Tag="{Binding}"/> <MenuItem Header="管理员方式运行" Click="IconAdminStart" Tag="{Binding}"/>
<MenuItem Header="打开文件所在位置" Click="ShowInExplore" Tag="{Binding}"/> <MenuItem Header="打开文件所在位置" Click="ShowInExplore" Tag="{Binding}"/>
<MenuItem Header="添加URL项目" Click="AddUrlIcon"/>
<MenuItem Header="添加系统项目" Click="AddSystemIcon"/>
<MenuItem Header="资源管理器菜单" Click="SystemContextMenu" Tag="{Binding}"/> <MenuItem Header="资源管理器菜单" Click="SystemContextMenu" Tag="{Binding}"/>
<MenuItem Header="属性" Click="PropertyConfig" Tag="{Binding}"/> <MenuItem Header="属性" Click="PropertyConfig" Tag="{Binding}"/>
<MenuItem Header="从列表移除" Click="RemoveIcon" Tag="{Binding}"/> <MenuItem Header="从列表移除" Click="RemoveIcon" Tag="{Binding}"/>
@@ -74,25 +86,29 @@
<ListBox.ItemContainerStyle> <ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem" BasedOn="{StaticResource MyListBoxItemStyle}"> <Style TargetType="ListBoxItem" BasedOn="{StaticResource MyListBoxItemStyle}">
<Setter Property="ContextMenu" Value="{StaticResource IconDialog}"/> <Setter Property="ContextMenu" Value="{StaticResource IconDialog}"/>
<!--<Setter Property="Width" Value="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImgPanelWidth, Mode=OneWay}"/>
<Setter Property="Height" Value="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImgPanelHeight, Mode=OneWay}"/>-->
</Style> </Style>
</ListBox.ItemContainerStyle> </ListBox.ItemContainerStyle>
<!--Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImgPanelHeight, Mode=OneWay}"
Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImgPanelWidth, Mode=OneWay}"-->
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate> <DataTemplate>
<StackPanel Tag="{Binding}" <hc:SimpleStackPanel Tag="{Binding}"
Height="110" Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImgPanelHeight, Mode=OneWay}"
Width="110" Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.ImgPanelWidth, Mode=OneWay}"
HorizontalAlignment="Center" HorizontalAlignment="Center"
hc:Poptip.HitMode="None" hc:Poptip.HitMode="None"
hc:Poptip.IsOpen="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" hc:Poptip.IsOpen="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}"
hc:Poptip.Content="{Binding Content}" hc:Poptip.Content="{Binding Content}"
hc:Poptip.Placement="BottomLeft" hc:Poptip.Placement="BottomLeft"
Background="#00FFFFFF" Background="#00FFFFFF"
MouseLeftButtonUp="IconClick" MouseLeftButtonDown="IconClick"
MouseEnter="StackPanel_MouseEnter" MouseEnter="StackPanel_MouseEnter"
MouseLeave="StackPanel_MouseLeave" MouseLeave="StackPanel_MouseLeave"
> >
<Image Style="{StaticResource ImageStyle}"/> <Image Style="{StaticResource ImageStyle}" RenderOptions.BitmapScalingMode="HighQuality"/>
<TextBlock MaxWidth="80" <TextBlock MaxWidth="80"
Margin="0,5,0,0" Margin="0,5,0,0"
MaxHeight="40" MaxHeight="40"
@@ -101,11 +117,13 @@
TextTrimming="WordEllipsis" TextTrimming="WordEllipsis"
TextAlignment="Center" TextAlignment="Center"
VerticalAlignment="Center" VerticalAlignment="Center"
Foreground="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.AppConfig.TextColor}"
Text="{Binding Name}"/> Text="{Binding Name}"/>
</StackPanel> </hc:SimpleStackPanel>
</DataTemplate> </DataTemplate>
</ListBox.ItemTemplate> </ListBox.ItemTemplate>
</ListBox> </ListBox>
</WrapPanel> </WrapPanel>
</hc:Card> </hc:Card>
</UserControl> </UserControl>

View File

@@ -1,27 +1,21 @@
using DraggAnimatedPanelExample; using DraggAnimatedPanelExample;
using GeekDesk.Constant; using GeekDesk.Constant;
using GeekDesk.Control.Other; using GeekDesk.Control.Other;
using GeekDesk.Control.Windows;
using GeekDesk.Util; using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using HandyControl.Controls;
using System; using System;
using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Linq; using System.Text.RegularExpressions;
using System.Text; using System.Threading;
using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation; using System.Windows.Media.Animation;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GeekDesk.Control.UserControls.PannelCard namespace GeekDesk.Control.UserControls.PannelCard
{ {
@@ -31,6 +25,7 @@ namespace GeekDesk.Control.UserControls.PannelCard
public partial class RightCardControl : UserControl public partial class RightCardControl : UserControl
{ {
private AppData appData = MainWindow.appData; private AppData appData = MainWindow.appData;
public RightCardControl() public RightCardControl()
{ {
InitializeComponent(); InitializeComponent();
@@ -72,7 +67,9 @@ namespace GeekDesk.Control.UserControls.PannelCard
/// <param name="e"></param> /// <param name="e"></param>
private void IconClick(object sender, MouseButtonEventArgs e) private void IconClick(object sender, MouseButtonEventArgs e)
{ {
IconInfo icon = (IconInfo)((StackPanel)sender).Tag; if (appData.AppConfig.DoubleOpen && e.ClickCount >= 2)
{
IconInfo icon = (IconInfo)((SimpleStackPanel)sender).Tag;
if (icon.AdminStartUp) if (icon.AdminStartUp)
{ {
StartIconApp(icon, IconStartType.ADMIN_STARTUP); StartIconApp(icon, IconStartType.ADMIN_STARTUP);
@@ -81,6 +78,19 @@ namespace GeekDesk.Control.UserControls.PannelCard
{ {
StartIconApp(icon, IconStartType.DEFAULT_STARTUP); StartIconApp(icon, IconStartType.DEFAULT_STARTUP);
} }
} else if (!appData.AppConfig.DoubleOpen && e.ClickCount == 1)
{
IconInfo icon = (IconInfo)((SimpleStackPanel)sender).Tag;
if (icon.AdminStartUp)
{
StartIconApp(icon, IconStartType.ADMIN_STARTUP);
}
else
{
StartIconApp(icon, IconStartType.DEFAULT_STARTUP);
}
}
} }
/// <summary> /// <summary>
@@ -109,35 +119,68 @@ namespace GeekDesk.Control.UserControls.PannelCard
{ {
try try
{ {
Process p = new Process();
string startArg = icon.StartArg;
if (startArg!=null && Constants.SYSTEM_ICONS.ContainsKey(startArg))
{
StartSystemApp(startArg, type);
} else
{
p.StartInfo.FileName = icon.Path;
if (!StringUtil.IsEmpty(startArg))
{
p.StartInfo.Arguments = startArg;
}
if (icon.IconType == IconType.OTHER)
{
if (!File.Exists(icon.Path) && !Directory.Exists(icon.Path)) if (!File.Exists(icon.Path) && !Directory.Exists(icon.Path))
{ {
HandyControl.Controls.Growl.WarningGlobal("程序启动失败(文件路径不存在或已删除)!"); HandyControl.Controls.Growl.WarningGlobal("程序启动失败(文件路径不存在或已删除)!");
return; return;
} }
p.StartInfo.WorkingDirectory = icon.Path.Substring(0, icon.Path.LastIndexOf("\\"));
Process p = new Process();
p.StartInfo.FileName = icon.Path;
switch (type) switch (type)
{ {
case IconStartType.ADMIN_STARTUP: case IconStartType.ADMIN_STARTUP:
p.StartInfo.Arguments = "1";//启动参数 //p.StartInfo.Arguments = "1";//启动参数
p.StartInfo.Verb = "runas"; p.StartInfo.Verb = "runas";
p.StartInfo.CreateNoWindow = false; //设置显示窗口 p.StartInfo.CreateNoWindow = false; //设置显示窗口
p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动进程 p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动进程
p.StartInfo.ErrorDialog = false; p.StartInfo.ErrorDialog = false;
if (appData.AppConfig.AppHideType == AppHideType.START_EXE) if (appData.AppConfig.AppHideType == AppHideType.START_EXE)
{ {
Window parentWin = Window.GetWindow(this); //如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
parentWin.Visibility = Visibility.Collapsed; if (appData.AppConfig.MarginHide)
{
if (!MarginHide.IS_HIDE)
{
MainWindow.HideApp();
}
}
else
{
MainWindow.HideApp();
}
} }
break;// c#好像不能case穿透 break;// c#好像不能case穿透
case IconStartType.DEFAULT_STARTUP: case IconStartType.DEFAULT_STARTUP:
if (appData.AppConfig.AppHideType == AppHideType.START_EXE) if (appData.AppConfig.AppHideType == AppHideType.START_EXE)
{ {
Window parentWin = Window.GetWindow(this); //如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
parentWin.Visibility = Visibility.Collapsed; if (appData.AppConfig.MarginHide)
{
if (!MarginHide.IS_HIDE)
{
MainWindow.HideApp();
}
}
else
{
MainWindow.HideApp();
}
} }
break; break;
case IconStartType.SHOW_IN_EXPLORE: case IconStartType.SHOW_IN_EXPLORE:
@@ -145,18 +188,113 @@ namespace GeekDesk.Control.UserControls.PannelCard
p.StartInfo.Arguments = "/e,/select," + icon.Path; p.StartInfo.Arguments = "/e,/select," + icon.Path;
break; break;
} }
}
else
{
if (appData.AppConfig.AppHideType == AppHideType.START_EXE)
{
//如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
if (appData.AppConfig.MarginHide)
{
if (!MarginHide.IS_HIDE)
{
MainWindow.HideApp();
}
}
else
{
MainWindow.HideApp();
}
}
}
p.Start(); p.Start();
}
icon.Count++; icon.Count++;
} }
catch (Exception) catch (Exception e)
{ {
HandyControl.Controls.Growl.WarningGlobal("程序启动失败(不支持的启动方式)!"); HandyControl.Controls.Growl.WarningGlobal("程序启动失败(不支持的启动方式)!");
LogUtil.WriteErrorLog(e, "程序启动失败:path=" + icon.Path + ",type=" + type);
} }
} }
private void StartSystemApp(string startArg, IconStartType type)
{
if (type == IconStartType.SHOW_IN_EXPLORE)
{
Growl.WarningGlobal("系统项目不支持打开文件位置操作!");
return;
}
switch (startArg)
{
case "Calculator":
Process.Start("calc.exe");
break;
case "Computer":
Process.Start("explorer.exe");
break;
case "GroupPolicy":
Process.Start("gpedit.msc");
break;
case "Notepad":
Process.Start("notepad");
break;
case "Network":
Process.Start("ncpa.cpl");
break;
case "RecycleBin":
Process.Start("shell:RecycleBinFolder");
break;
case "Registry":
Process.Start("regedit.exe");
break;
case "Mstsc":
if (type == IconStartType.ADMIN_STARTUP)
{
Process.Start("mstsc", "-admin");
} else
{
Process.Start("mstsc");
}
break;
case "Control":
Process.Start("Control");
break;
case "CMD":
if (type == IconStartType.ADMIN_STARTUP)
{
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Verb = "runas";
process.Start();
} else
{
Process.Start("cmd");
}
break;
}
//如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
if (appData.AppConfig.MarginHide)
{
if (!MarginHide.IS_HIDE)
{
MainWindow.HideApp();
}
}
else
{
MainWindow.HideApp();
}
}
/// <summary>
/// 拖动添加项目
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Wrap_Drop(object sender, DragEventArgs e) private void Wrap_Drop(object sender, DragEventArgs e)
{ {
Array dropObject = (System.Array)e.Data.GetData(DataFormats.FileDrop); Array dropObject = (System.Array)e.Data.GetData(DataFormats.FileDrop);
@@ -164,31 +302,7 @@ namespace GeekDesk.Control.UserControls.PannelCard
foreach (object obj in dropObject) foreach (object obj in dropObject)
{ {
string path = (string)obj; string path = (string)obj;
IconInfo iconInfo = CommonCode.GetIconInfoByPath(path);
//string base64 = ImageUtil.FileImageToBase64(path, ImageFormat.Jpeg);
string ext = System.IO.Path.GetExtension(path).ToLower();
if (".lnk".Equals(ext))
{
string targetPath = FileUtil.GetTargetPathByLnk(path);
if (targetPath!=null)
{
path = targetPath;
}
}
IconInfo iconInfo = new IconInfo
{
Path = path,
BitmapImage = ImageUtil.GetBitmapIconByPath(path)
};
iconInfo.DefaultImage = iconInfo.ImageByteArr;
iconInfo.Name = System.IO.Path.GetFileNameWithoutExtension(path);
if (StringUtil.IsEmpty(iconInfo.Name))
{
iconInfo.Name = path;
}
MainWindow.appData.MenuList[appData.AppConfig.SelectedMenuIndex].IconList.Add(iconInfo); MainWindow.appData.MenuList[appData.AppConfig.SelectedMenuIndex].IconList.Add(iconInfo);
CommonCode.SaveAppData(MainWindow.appData); CommonCode.SaveAppData(MainWindow.appData);
} }
@@ -223,48 +337,179 @@ namespace GeekDesk.Control.UserControls.PannelCard
/// <param name="e"></param> /// <param name="e"></param>
private void PropertyConfig(object sender, RoutedEventArgs e) private void PropertyConfig(object sender, RoutedEventArgs e)
{ {
HandyControl.Controls.Dialog.Show(new IconInfoDialog((IconInfo)((MenuItem)sender).Tag)); IconInfo info = (IconInfo)((MenuItem)sender).Tag;
switch (info.IconType)
{
case IconType.URL:
IconInfoUrlDialog urlDialog = new IconInfoUrlDialog(info);
urlDialog.dialog = HandyControl.Controls.Dialog.Show(urlDialog, "IconInfoDialog");
break;
default:
IconInfoDialog dialog = new IconInfoDialog(info);
dialog.dialog = HandyControl.Controls.Dialog.Show(dialog, "IconInfoDialog");
break;
}
} }
private void StackPanel_MouseEnter(object sender, MouseEventArgs e) private void StackPanel_MouseEnter(object sender, MouseEventArgs e)
{ {
ImgStroyBoard(sender, (int)MainWindowEnum.IMAGE_HEIGHT_AM, (int)MainWindowEnum.IMAGE_WIDTH_AM, 1);
double width = appData.AppConfig.ImageWidth;
double height = appData.AppConfig.ImageHeight;
width += width * 0.15;
height += height * 0.15;
ImgStoryBoard(sender, (int)width, (int)height, 1, true);
} }
private void StackPanel_MouseLeave(object sender, MouseEventArgs e) private void StackPanel_MouseLeave(object sender, MouseEventArgs e)
{ {
ImgStroyBoard(sender, (int)MainWindowEnum.IMAGE_HEIGHT, (int)MainWindowEnum.IMAGE_WIDTH, 250); ImgStoryBoard(sender, appData.AppConfig.ImageWidth, appData.AppConfig.ImageHeight, 220);
} }
private void ImgStroyBoard(object sender, int height, int width, int milliseconds) private void ImgStoryBoard(object sender, int height, int width, int milliseconds, bool checkRmStoryboard = false)
{ {
if (appData.AppConfig.PMModel) return; if (appData.AppConfig.PMModel) return;
StackPanel sp = sender as StackPanel; Panel sp = sender as Panel;
DependencyObject dos = sp.Parent;
Image img = sp.Children[0] as Image; Image img = sp.Children[0] as Image;
double afterHeight = img.Height;
double afterWidth = img.Width;
DoubleAnimation heightAnimation = new DoubleAnimation(); //动画定义
DoubleAnimation widthAnimation = new DoubleAnimation(); Storyboard myStoryboard = new Storyboard();
heightAnimation.From = img.Height;
widthAnimation.From = img.Width;
heightAnimation.To = height;
widthAnimation.To = width;
heightAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(milliseconds)); DoubleAnimation heightAnimation = new DoubleAnimation
widthAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(milliseconds)); {
From = afterHeight,
To = height,
Duration = new Duration(TimeSpan.FromMilliseconds(milliseconds))
};
DoubleAnimation widthAnimation = new DoubleAnimation
{
From = afterWidth,
To = width,
Duration = new Duration(TimeSpan.FromMilliseconds(milliseconds))
};
Timeline.SetDesiredFrameRate(heightAnimation, 60); Timeline.SetDesiredFrameRate(heightAnimation, 60);
Timeline.SetDesiredFrameRate(widthAnimation, 60); Timeline.SetDesiredFrameRate(widthAnimation, 60);
img.BeginAnimation(HeightProperty, heightAnimation); Storyboard.SetTarget(widthAnimation, img);
Storyboard.SetTargetProperty(widthAnimation, new PropertyPath("Width"));
Storyboard.SetTarget(heightAnimation, img);
Storyboard.SetTargetProperty(heightAnimation, new PropertyPath("Height"));
myStoryboard.Children.Add(heightAnimation);
myStoryboard.Children.Add(widthAnimation);
CheckRemoveStoryboard crs = new CheckRemoveStoryboard
{
sb = myStoryboard,
sp = sp,
heightAnimation = heightAnimation,
widthAnimation = widthAnimation,
img = img,
isMouseOver = !checkRmStoryboard
};
heightAnimation.Completed += (s, e) =>
{
if (checkRmStoryboard)
{
ThreadStart ts = new ThreadStart(crs.Remove);
System.Threading.Thread t = new System.Threading.Thread(ts);
t.Start();
} else
{
img.BeginAnimation(WidthProperty, null);
img.BeginAnimation(HeightProperty, null);
}
};
img.BeginAnimation(WidthProperty, widthAnimation); img.BeginAnimation(WidthProperty, widthAnimation);
img.BeginAnimation(HeightProperty, heightAnimation);
//myStoryboard.Completed += (s, e) =>
//{
// if (checkRmStoryboard || true)
// {
// ThreadStart ts = new ThreadStart(crs.Remove);
// System.Threading.Thread t = new System.Threading.Thread(ts);
// t.Start();
// }
// else
// {
// myStoryboard.Remove();
// }
//};
//myStoryboard.Begin();
}
private class CheckRemoveStoryboard
{
public Storyboard sb;
public Panel sp;
public Image img;
public DoubleAnimation heightAnimation;
public DoubleAnimation widthAnimation;
public bool isMouseOver;
public void Remove()
{
while (true)
{
if (sp.IsMouseOver == isMouseOver)
{
App.Current.Dispatcher.Invoke((Action)(() =>
{
img.BeginAnimation(WidthProperty, null);
img.BeginAnimation(HeightProperty, null);
//heightAnimation.FillBehavior = FillBehavior.Stop;
//widthAnimation.FillBehavior = FillBehavior.Stop;
}));
return;
}
else
{
System.Threading.Thread.Sleep(500);
}
}
}
}
public void RemoveSB(Object sb)
{
Storyboard sb2 = sb as Storyboard;
System.Threading.Thread.Sleep(500);
sb2.Remove();
}
/// <summary>
/// 添加URL项目
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddUrlIcon(object sender, RoutedEventArgs e)
{
IconInfoUrlDialog urlDialog = new IconInfoUrlDialog();
urlDialog.dialog = HandyControl.Controls.Dialog.Show(urlDialog, "IconInfoDialog");
}
/// <summary>
/// 添加系统项目
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddSystemIcon(object sender, RoutedEventArgs e)
{
SystemItemWindow.Show();
} }
} }
} }

View File

@@ -0,0 +1,57 @@
<UserControl x:Class="GeekDesk.Control.UserControls.SystemItem.SystemItem"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:local="clr-namespace:GeekDesk.Control.UserControls.IconFont"
mc:Ignorable="d"
Background="#00FFFFFF"
>
<WrapPanel HorizontalAlignment="Center" VerticalAlignment="Top" Background="Transparent">
<ListBox x:Name="ItemListBox" ItemsSource="{Binding IconInfos}" BorderThickness="0"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsContainerVirtualizable="True"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" Background="#00FFFFFF"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.Background>
<SolidColorBrush Opacity="0"/>
</ListBox.Background>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Width="80" Height="80" HorizontalAlignment="Center"
Background="#00FFFFFF"
hc:Poptip.IsOpen="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}"
hc:Poptip.Content="{Binding Content_NoWrite, Mode=OneWay}"
Tag="{Binding}"
MouseLeftButtonDown="Icon_MouseLeftButtonDown"
hc:Poptip.Placement="BottomLeft"
hc:Poptip.HitMode="None"
>
<Image Source="{Binding BitmapImage_NoWrite, Mode=OneWay}" Width="45" Height="45" RenderOptions.BitmapScalingMode="HighQuality" />
<TextBlock TextAlignment="Center"
HorizontalAlignment="Center"
VerticalAlignment="Center"
TextWrapping="Wrap"
MaxHeight="40"
FontSize="13"
TextTrimming="WordEllipsis"
Width="65" Text="{Binding Name_NoWrite, Mode=OneWay}"
/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</WrapPanel>
</UserControl>

View File

@@ -0,0 +1,59 @@
using GeekDesk.Constant;
using GeekDesk.Util;
using GeekDesk.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GeekDesk.Control.UserControls.SystemItem
{
/// <summary>
/// IconPannel.xaml 的交互逻辑
/// </summary>
public partial class SystemItem : UserControl
{
public SystemItem()
{
InitializeComponent();
}
private void Icon_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
IconInfo thisInfo = (sender as StackPanel).Tag as IconInfo;
MenuInfo menuInfo = MainWindow.appData.MenuList[MainWindow.appData.AppConfig.SelectedMenuIndex];
string startArg = thisInfo.StartArg;
IconInfo iconInfo;
if (Constants.SYSTEM_ICONS.ContainsKey(startArg))
{
//系统项
iconInfo = new IconInfo
{
Name_NoWrite = thisInfo.Name_NoWrite,
Path_NoWrite = thisInfo.Path_NoWrite,
StartArg_NoWrite = thisInfo.StartArg_NoWrite,
BitmapImage_NoWrite = thisInfo.BitmapImage_NoWrite
};
iconInfo.Content_NoWrite = iconInfo.Name_NoWrite
+ "\n使用次数:" + iconInfo.Count;
} else
{
//startupMenu or Store
iconInfo = CommonCode.GetIconInfoByPath(thisInfo.LnkPath_NoWrite);
}
menuInfo.IconList.Add(iconInfo);
CommonCode.SaveAppData(MainWindow.appData);
}
}
}

View File

@@ -4,13 +4,13 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GeekDesk.Control.UserControls.PannelCard" xmlns:local="clr-namespace:GeekDesk.Control.UserControls.PannelCard"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:viewmodel="clr-namespace:GeekDesk.ViewModel" d:DataContext="{d:DesignInstance Type=viewmodel:ToDoInfo}"
mc:Ignorable="d" mc:Ignorable="d"
Background="AliceBlue" Background="Transparent"
> >
<hc:SimplePanel Margin="20"> <hc:SimplePanel Margin="20" Background="Transparent">
<Grid> <Grid Background="Transparent">
<DataGrid x:Name="BacklogList" <DataGrid x:Name="BacklogList"
HeadersVisibility="All" HeadersVisibility="All"
AutoGenerateColumns="False" AutoGenerateColumns="False"
@@ -26,13 +26,29 @@
</DataGrid.ContextMenu> </DataGrid.ContextMenu>
<DataGrid.RowStyle> <DataGrid.RowStyle>
<Style TargetType="DataGridRow" BasedOn="{StaticResource DataGridRowStyle}"> <Style TargetType="DataGridRow" BasedOn="{StaticResource DataGridRowStyle}">
<EventSetter Event="MouseRightButtonUp" Handler="DataGridRow_MouseRightButtonUp" /> <EventSetter Event="MouseRightButtonDown" Handler="DataGridRow_MouseRightButtonDown" />
<Setter Property="Background" Value="White"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{StaticResource BtnBG}"/>
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter Property="Background" Value="White"/>
</Trigger>
</Style.Triggers>
</Style> </Style>
</DataGrid.RowStyle> </DataGrid.RowStyle>
<DataGrid.CellStyle> <DataGrid.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource DataGridCellStyle}"> <Style TargetType="DataGridCell" BasedOn="{StaticResource DataGridCellStyle}">
<Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style> </Style>
</DataGrid.CellStyle> </DataGrid.CellStyle>
<DataGrid.ColumnHeaderStyle> <DataGrid.ColumnHeaderStyle>
@@ -42,7 +58,7 @@
</DataGrid.ColumnHeaderStyle> </DataGrid.ColumnHeaderStyle>
<DataGrid.Background> <DataGrid.Background>
<SolidColorBrush Color="AliceBlue"/> <SolidColorBrush Color="Transparent"/>
</DataGrid.Background> </DataGrid.Background>
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Width="120" Binding="{Binding Title}" Header="待办任务"/> <DataGridTextColumn Width="120" Binding="{Binding Title}" Header="待办任务"/>

View File

@@ -19,12 +19,18 @@ using System.Windows.Shapes;
namespace GeekDesk.Control.UserControls.Backlog namespace GeekDesk.Control.UserControls.Backlog
{ {
public enum ToDoType
{
HISTORY = 1,
NEW = 2
}
/// <summary> /// <summary>
/// BacklogControl.xaml 的交互逻辑 /// BacklogControl.xaml 的交互逻辑
/// </summary> /// </summary>
public partial class TodoControl : UserControl public partial class TodoControl : UserControl
{ {
private AppData appData = MainWindow.appData; public ToDoType type;
public TodoControl() public TodoControl()
{ {
InitializeComponent(); InitializeComponent();
@@ -37,7 +43,14 @@ namespace GeekDesk.Control.UserControls.Backlog
{ {
if (isConfirmed) if (isConfirmed)
{ {
appData.ToDoList.Remove(info); if (type == ToDoType.NEW)
{
MainWindow.appData.ToDoList.Remove(info);
}
else
{
MainWindow.appData.HiToDoList.Remove(info);
}
CommonCode.SaveAppData(MainWindow.appData); CommonCode.SaveAppData(MainWindow.appData);
} }
return true; return true;
@@ -60,13 +73,16 @@ namespace GeekDesk.Control.UserControls.Backlog
BacklogList.ContextMenu = null; BacklogList.ContextMenu = null;
} }
/// <summary>
private void DataGridRow_MouseRightButtonUp(object sender, MouseButtonEventArgs e) /// 打开右键菜单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DataGridRow_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{ {
BacklogList.SelectedIndex = ((DataGridRow)sender).GetIndex(); BacklogList.SelectedIndex = ((DataGridRow)sender).GetIndex();
Menu.IsOpen = true; Menu.IsOpen = true;
} }
} }
} }

View File

@@ -8,33 +8,24 @@
Title="Setting" Title="Setting"
mc:Ignorable="d" mc:Ignorable="d"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Height="450" Height="550"
Width="600" Width="750"
WindowStyle="None" WindowStyle="None"
ResizeMode="NoResize"
AllowsTransparency="True" AllowsTransparency="True"
Background="Transparent" ShowInTaskbar="False" Background="#00FFFFFF" ShowInTaskbar="False"
BorderThickness="0"
Focusable="True"
KeyDown="OnKeyDown"
> >
<Window.Resources> <Grid Margin="30">
<Style x:Key="MenuStyle" TargetType="hc:SideMenuItem" BasedOn="{StaticResource SideMenuItemBaseStyle}"> <Grid.Effect>
<Style.Setters> <DropShadowEffect BlurRadius="20" Direction="-90" Color="Gray"
<Setter Property="Background" Value="AliceBlue"/> RenderingBias="Quality" ShadowDepth="2"/>
</Style.Setters> </Grid.Effect>
<Style.Triggers> <Border Style="{StaticResource BorderBG}">
<Trigger Property="IsMouseOver" Value="True"> <Grid Background="Transparent">
<Setter Property="Background" Value="#FFE2E2E2"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#FFDAD7D7"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Border CornerRadius="8" BorderThickness="0">
<Border.Background>
<SolidColorBrush Color="AliceBlue" Opacity="0.9"/>
</Border.Background>
<Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
@@ -43,16 +34,11 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<hc:Card Grid.Row="0" Grid.Column="0"> <hc:Card Grid.Row="0" Grid.Column="0" Background="Transparent" BorderThickness="0">
<hc:SideMenu BorderThickness="1"
AutoSelect="True"
>
<hc:SideMenu.Background>
<SolidColorBrush Color="AliceBlue"/>
</hc:SideMenu.Background>
<hc:SideMenu AutoSelect="True" Background="Transparent" Margin="1,7,0,3">
<hc:SideMenu.ItemContainerStyle> <hc:SideMenu.ItemContainerStyle>
<Style TargetType="hc:SideMenuItem" BasedOn="{StaticResource MenuStyle}"/> <Style TargetType="hc:SideMenuItem" BasedOn="{StaticResource MyMenuStyle}"/>
</hc:SideMenu.ItemContainerStyle> </hc:SideMenu.ItemContainerStyle>
<hc:SideMenuItem Header="关于" <hc:SideMenuItem Header="关于"
@@ -63,7 +49,7 @@
<hc:SideMenuItem.Icon> <hc:SideMenuItem.Icon>
<Button Background="Transparent" <Button Background="Transparent"
IsEnabled="False" IsEnabled="False"
Opacity="1" Opacity="0.9"
BorderThickness="0" BorderThickness="0"
hc:IconElement.Geometry="{StaticResource About}" hc:IconElement.Geometry="{StaticResource About}"
hc:IconElement.Height="18" hc:IconElement.Height="18"
@@ -120,13 +106,17 @@
</hc:SideMenuItem> </hc:SideMenuItem>
</hc:SideMenu> </hc:SideMenu>
</hc:Card> </hc:Card>
<hc:ScrollViewer Grid.Row="0" Grid.Column="1"> <hc:ScrollViewer Grid.Row="0" Grid.Column="1" BorderThickness="0" Margin="0,5,1,5">
<hc:Card x:Name="RightCard" Height="448" MouseDown="DragMove"> <hc:Card x:Name="RightCard" Height="480" BorderThickness="0" MouseDown="DragMove">
<hc:Card.Background>
<SolidColorBrush Opacity="0"/>
</hc:Card.Background>
</hc:Card> </hc:Card>
</hc:ScrollViewer> </hc:ScrollViewer>
<Button Width="22" Height="22" Click="Close_Button_Click" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,10,10,0" Grid.Column="1"/> <Button Width="22" Height="22" Click="Close_Button_Click" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,10,10,0" Grid.Column="1"/>
</Grid> </Grid>
</Border> </Border>
</Grid>
</hc:Window> </hc:Window>

View File

@@ -1,6 +1,9 @@
 
using GeekDesk.Constant;
using GeekDesk.Control.UserControls; using GeekDesk.Control.UserControls;
using GeekDesk.Control.UserControls.Config; using GeekDesk.Control.UserControls.Config;
using GeekDesk.Interface;
using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using HandyControl.Controls; using HandyControl.Controls;
using HandyControl.Data; using HandyControl.Data;
@@ -13,17 +16,18 @@ namespace GeekDesk.Control.Windows
/// <summary> /// <summary>
/// ConfigDialog.xaml 的交互逻辑 /// ConfigDialog.xaml 的交互逻辑
/// </summary> /// </summary>
public partial class ConfigWindow public partial class ConfigWindow : IWindowCommon
{ {
private static AboutControl about = new AboutControl(); private static readonly AboutControl about = new AboutControl();
private static ThemeControl theme = new ThemeControl(); private static readonly ThemeControl theme = new ThemeControl();
private static MotionControl motion = new MotionControl(); private static readonly MotionControl motion = new MotionControl();
private static OtherControl other = new OtherControl(); private static readonly OtherControl other = new OtherControl();
public MainWindow mainWindow; public MainWindow mainWindow;
private ConfigWindow(AppConfig appConfig, MainWindow mainWindow) private ConfigWindow(AppConfig appConfig, MainWindow mainWindow)
{ {
InitializeComponent(); InitializeComponent();
//BG.Source = ImageUtil.Base64ToBitmapImage(Constants.DEFAULT_BAC_IMAGE_BASE64);
this.DataContext = appConfig; this.DataContext = appConfig;
RightCard.Content = about; RightCard.Content = about;
this.Topmost = true; this.Topmost = true;
@@ -31,18 +35,7 @@ namespace GeekDesk.Control.Windows
} }
/// <summary>
/// 移动窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
DragMove();
}
}
/// <summary> /// <summary>
/// 点击关闭按钮 /// 点击关闭按钮
@@ -74,6 +67,19 @@ namespace GeekDesk.Control.Windows
} }
} }
/// <summary>
/// 移动窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
this.DragMove();
}
}
private static System.Windows.Window window = null; private static System.Windows.Window window = null;
public static void Show(AppConfig appConfig, MainWindow mainWindow) public static void Show(AppConfig appConfig, MainWindow mainWindow)
{ {
@@ -82,6 +88,15 @@ namespace GeekDesk.Control.Windows
window = new ConfigWindow(appConfig, mainWindow); window = new ConfigWindow(appConfig, mainWindow);
} }
window.Show(); window.Show();
Keyboard.Focus(window);
}
public void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
} }
} }
} }

View File

@@ -8,34 +8,66 @@
xmlns:uc="clr-namespace:GeekDesk.Control.UserControls.IconFont" xmlns:uc="clr-namespace:GeekDesk.Control.UserControls.IconFont"
mc:Ignorable="d" mc:Ignorable="d"
Title="Svg" Title="Svg"
Height="450" Width="600" Height="520" Width="700"
WindowStyle="None" WindowStyle="None"
ResizeMode="NoResize"
AllowsTransparency="True" AllowsTransparency="True"
Background="AliceBlue" Background="Transparent" ShowInTaskbar="False"
MouseDown="DragMove" BorderThickness="0"
Focusable="True"
KeyDown="OnKeyDown"
> >
<Window.Resources> <Window.Resources>
<Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}"> <Style x:Key="HcTabControl" TargetType="hc:TabControl" BasedOn="{StaticResource TabControlInLine}">
<Setter Property="Width" Value="80"/> <Style.Setters>
<Setter Property="HorizontalAlignment" Value="Left"/> <Setter Property="Background" Value="Transparent"/>
<Setter Property="VerticalAlignment" Value="Center"/> </Style.Setters>
<Setter Property="FontSize" Value="11"/> </Style>
<Style x:Key="TabTitle" TargetType="hc:TabItem" BasedOn="{StaticResource TabItemInLine}">
<Style.Setters>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="White" Opacity="0.68"/>
</Setter.Value>
</Setter>
</Style.Setters>
</Style> </Style>
</Window.Resources> </Window.Resources>
<Grid Margin="20">
<Border MouseDown="DragMove"> <Grid.Effect>
<DropShadowEffect BlurRadius="30" Direction="-90" Color="Gray"
RenderingBias="Quality" ShadowDepth="2"/>
</Grid.Effect>
<Border MouseDown="DragMove" Style="{StaticResource BorderBG}" hc:Dialog.Token="IconUrlDialog">
<!--<Border.Background>
--><!--<SolidColorBrush Color="AliceBlue" Opacity="0.9"/>--><!--
<LinearGradientBrush Opacity="0.97">
<GradientStop Color="#D1F0A4" Offset="0"/>
<GradientStop Color="#97D282" Offset="1"/>
</LinearGradientBrush>
</Border.Background>-->
<hc:DialogContainer>
<Grid MouseDown="DragMove"> <Grid MouseDown="DragMove">
<TextBox x:Name="CheckSettingUrl" Visibility="Collapsed" Text="{Binding IsSettingUrl}" TextChanged="CheckSettingUrl_TextChanged"/> <TextBox x:Name="CheckSettingUrl" Visibility="Collapsed" Text="{Binding IsSettingUrl}" TextChanged="CheckSettingUrl_TextChanged"/>
<hc:TabControl x:Name="MyTabControl" IsAnimationEnabled="True" SelectionChanged="TabControl_SelectionChanged" ShowContextMenu="True" IsTabFillEnabled="True" Margin="20,30,20,20" Height="350" VerticalAlignment="Top"> <hc:TabControl x:Name="MyTabControl"
<hc:TabItem Tag="System" IsSelected="True" Header="系统图标" hc:IconElement.Height="16" hc:IconElement.Width="16" hc:IconElement.Geometry="{StaticResource SystemIcon}" > IsAnimationEnabled="True"
<hc:SimplePanel Background="AliceBlue"> SelectionChanged="TabControl_SelectionChanged"
ShowContextMenu="True"
IsTabFillEnabled="True"
Margin="20,30,20,20"
Height="350"
VerticalAlignment="Top"
Style="{StaticResource HcTabControl}">
<hc:TabItem Tag="System" IsSelected="True" Header="系统图标" hc:IconElement.Height="16" hc:IconElement.Width="16" hc:IconElement.Geometry="{StaticResource SystemIcon}" Style="{StaticResource TabTitle}">
<hc:SimplePanel>
<uc:IconPannel x:Name="SystemIcon"/> <uc:IconPannel x:Name="SystemIcon"/>
</hc:SimplePanel> </hc:SimplePanel>
</hc:TabItem> </hc:TabItem>
<hc:TabItem Tag="Custom" Header="自定义图标" hc:IconElement.Height="16" hc:IconElement.Width="16" hc:IconElement.Geometry="{StaticResource CustomIcon}"> <hc:TabItem Tag="Custom" Header="自定义图标" hc:IconElement.Height="16" hc:IconElement.Width="16" hc:IconElement.Geometry="{StaticResource CustomIcon}" Style="{StaticResource TabTitle}">
<hc:SimplePanel Background="AliceBlue"> <hc:SimplePanel>
<uc:IconPannel x:Name="CustomIcon"/> <uc:IconPannel x:Name="CustomIcon"/>
<hc:LoadingCircle x:Name="LoadingEle"/> <hc:LoadingCircle x:Name="LoadingEle"/>
</hc:SimplePanel> </hc:SimplePanel>
@@ -44,10 +76,12 @@
<Button Content="取消" Click="Close_Click" Margin="391,397.5,163,22.5"/> <Button Content="取消" Click="Close_Click" Margin="391,397.5,163,22.5"/>
<Button Content="自定义设置" Click="CustomButton_Click" IsEnabled="False" Name="CustomButton" Background="#5BC0DE" Foreground="White" RenderTransformOrigin="-0.868,0.583" Margin="447,397.5,71,22.5"/> <Button Content="自定义设置" Click="CustomButton_Click" IsEnabled="False" Name="CustomButton" Style="{StaticResource Btn1}" Margin="447,397.5,71,22.5"/>
<Button Content="确定" Click="Confirm_Click" Background="#5BC0DE" Foreground="White" Margin="534,397.5,20,22.5" RenderTransformOrigin="0.696,0.45"/> <Button Content="确定" Click="Confirm_Click" Style="{StaticResource Btn1}" Margin="534,397.5,20,22.5" />
</Grid> </Grid>
</hc:DialogContainer>
</Border> </Border>
</Grid>
</Window> </Window>

View File

@@ -1,4 +1,5 @@
using GeekDesk.Control.Other; using GeekDesk.Control.Other;
using GeekDesk.Interface;
using GeekDesk.Util; using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
@@ -10,14 +11,14 @@ using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using static GeekDesk.Util.ShowWindowFollowMouse;
namespace GeekDesk.Control.Windows namespace GeekDesk.Control.Windows
{ {
/// <summary> /// <summary>
/// IconfontWindow.xaml 的交互逻辑 /// IconfontWindow.xaml 的交互逻辑
/// </summary> /// </summary>
public partial class IconfontWindow : Window public partial class IconfontWindow : Window, IWindowCommon
{ {
private static AppConfig appConfig = MainWindow.appData.AppConfig; private static AppConfig appConfig = MainWindow.appData.AppConfig;
private static MenuInfo menuInfo; private static MenuInfo menuInfo;
@@ -71,7 +72,7 @@ namespace GeekDesk.Control.Windows
{ {
LoadingEle.Visibility = Visibility.Visible; LoadingEle.Visibility = Visibility.Visible;
CustomIcon.Visibility = Visibility.Collapsed; CustomIcon.Visibility = Visibility.Collapsed;
HandyControl.Controls.Dialog.Show(new CustomIconUrlDialog(appConfig)); HandyControl.Controls.Dialog.Show(new CustomIconUrlDialog(appConfig), "IconUrlDialog");
} else } else
{ {
if (customIcons == null) if (customIcons == null)
@@ -132,11 +133,13 @@ namespace GeekDesk.Control.Windows
window = new IconfontWindow(listInfo, menuInfo); window = new IconfontWindow(listInfo, menuInfo);
} }
window.Show(); window.Show();
Keyboard.Focus(window);
ShowWindowFollowMouse.Show(window, MousePosition.LEFT_CENTER, 0, 0, false);
} }
private void CustomButton_Click(object sender, RoutedEventArgs e) private void CustomButton_Click(object sender, RoutedEventArgs e)
{ {
HandyControl.Controls.Dialog.Show(new CustomIconUrlDialog(appConfig)); HandyControl.Controls.Dialog.Show(new CustomIconUrlDialog(appConfig), "IconUrlDialog");
} }
@@ -165,12 +168,20 @@ namespace GeekDesk.Control.Windows
LoadingEle.Visibility = Visibility.Collapsed; LoadingEle.Visibility = Visibility.Collapsed;
CustomIcon.Visibility = Visibility.Visible; CustomIcon.Visibility = Visibility.Visible;
} }
catch (Exception) catch (Exception e)
{ {
HandyControl.Controls.Growl.WarningGlobal("加载远程图标异常!"); HandyControl.Controls.Growl.WarningGlobal("加载远程图标异常!");
LogUtil.WriteErrorLog(e, "加载远程图标异常!");
} }
} }
public void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
}
public class IconfontViewModel : INotifyPropertyChanged public class IconfontViewModel : INotifyPropertyChanged
{ {

View File

@@ -0,0 +1,100 @@
<Window x:Class="GeekDesk.Control.Windows.SystemItemWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GeekDesk.Control.Windows"
xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:uc="clr-namespace:GeekDesk.Control.UserControls.SystemItem"
xmlns:cvt="clr-namespace:GeekDesk.Converts"
mc:Ignorable="d"
Title="Svg"
Height="520" Width="700"
WindowStyle="None"
ResizeMode="NoResize"
AllowsTransparency="True"
Background="Transparent" ShowInTaskbar="False"
BorderThickness="0"
Focusable="True"
KeyDown="OnKeyDown"
>
<Window.Resources>
<Style x:Key="HcTabControl" TargetType="hc:TabControl" BasedOn="{StaticResource TabControlInLine}">
<Style.Setters>
<Setter Property="Background" Value="Transparent"/>
</Style.Setters>
</Style>
<Style x:Key="TabTitle" TargetType="hc:TabItem" BasedOn="{StaticResource TabItemInLine}">
<Style.Setters>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="White" Opacity="0.68"/>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
<cvt:MenuInfoConvert x:Key="MenuInfoConvert"/>
</Window.Resources>
<Grid Margin="20">
<Grid.Effect>
<DropShadowEffect BlurRadius="30" Direction="-90" Color="Gray"
RenderingBias="Quality" ShadowDepth="2"/>
</Grid.Effect>
<Border MouseDown="DragMove" Style="{StaticResource BorderBG}" hc:Dialog.Token="IconUrlDialog">
<hc:DialogContainer>
<Grid MouseDown="DragMove">
<StackPanel HorizontalAlignment="Center" Margin="10">
<Border CornerRadius="8" Height="30" Width="150">
<Border.Background>
<SolidColorBrush Color="White" Opacity="0.7"/>
</Border.Background>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Background="Transparent"
BorderThickness="0"
hc:IconElement.Geometry="{Binding AppConfig.SelectedMenuIndex, Mode=OneWay, Converter={StaticResource MenuInfoConvert}, ConverterParameter=1}"
hc:IconElement.Height="18"
hc:IconElement.Width="18"
IsEnabled="False"
Opacity="1"
>
</Button>
<TextBlock x:Name="MenuName" Text="{Binding AppConfig.SelectedMenuIndex, Mode=OneWay, Converter={StaticResource MenuInfoConvert}, ConverterParameter=2}" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</StackPanel>
</Border>
</StackPanel>
<hc:TabControl x:Name="MyTabControl"
IsAnimationEnabled="True"
SelectionChanged="TabControl_SelectionChanged"
ShowContextMenu="True"
IsTabFillEnabled="True"
Margin="20,60,20,20"
Height="350"
VerticalAlignment="Top"
Style="{StaticResource HcTabControl}">
<hc:TabItem Tag="System" IsSelected="True" Header="系统应用" hc:IconElement.Height="16" hc:IconElement.Width="16" hc:IconElement.Geometry="{StaticResource SystemIcon}" Style="{StaticResource TabTitle}">
<hc:SimplePanel>
<uc:SystemItem x:Name="SystemItem"/>
</hc:SimplePanel>
</hc:TabItem>
<hc:TabItem x:Name="StartMenu" Tag="StartMenu" Header="开始菜单应用" hc:IconElement.Height="16" hc:IconElement.Width="16" hc:IconElement.Geometry="{StaticResource SystemIcon}" Style="{StaticResource TabTitle}">
<hc:SimplePanel>
<uc:SystemItem x:Name="StartMenuItem"/>
<hc:LoadingCircle x:Name="StartMenuLoading"/>
</hc:SimplePanel>
</hc:TabItem>
<!--<hc:TabItem Tag="Store" Header="商店应用(未开放)" hc:IconElement.Height="16" hc:IconElement.Width="16" hc:IconElement.Geometry="{StaticResource CustomIcon}" Style="{StaticResource TabTitle}">
<hc:SimplePanel>
<uc:SystemItem x:Name="StoreItem"/>
</hc:SimplePanel>
</hc:TabItem>-->
</hc:TabControl>
<Button Content="关闭" Click="Close_Click" Margin="594,420,20,31.5"/>
</Grid>
</hc:DialogContainer>
</Border>
</Grid>
</Window>

View File

@@ -0,0 +1,281 @@
using GeekDesk.Constant;
using GeekDesk.Control.Other;
using GeekDesk.Interface;
using GeekDesk.Util;
using GeekDesk.ViewModel;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Resources;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using static GeekDesk.Util.ShowWindowFollowMouse;
namespace GeekDesk.Control.Windows
{
/// <summary>
/// SystemItemWindow.xaml 的交互逻辑
/// 添加系统项目到对应菜单
/// </summary>
public partial class SystemItemWindow : Window, IWindowCommon
{
private static AppConfig appConfig = MainWindow.appData.AppConfig;
private static SystemItemViewModel vm;
private static List<IconInfo> systemIcons;
private static List<IconInfo> startMenuIcons;
private static List<IconInfo> storeIcons;
private SystemItemWindow()
{
vm = new SystemItemViewModel();
this.DataContext = vm;
InitializeComponent();
this.Topmost = true;
}
/// <summary>
/// 移动窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
DragMove();
}
}
private void Close_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
/// <summary>
/// 切换选项卡
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
TabItem ti = this.MyTabControl.SelectedItem as TabItem;
List<IconInfo> systemInfos = vm.IconInfos;
if (systemInfos == null)
{
systemInfos = new List<IconInfo>();
}
switch (ti.Tag.ToString())
{
case "StartMenu": //开始菜单
if (startMenuIcons == null)
{
vm.IconInfos = null;
System.Threading.Thread t = new System.Threading.Thread(new ThreadStart(GetStartMenuInfos))
{
IsBackground = true
};
t.Start();
} else
{
StartMenuLoading.Visibility = Visibility.Collapsed;
vm.IconInfos = startMenuIcons;
}
break;
case "Store": //应用商店
if (storeIcons == null)
{
vm.IconInfos = null;
storeIcons = new List<IconInfo>();
vm.IconInfos = storeIcons;
}
else
{
vm.IconInfos = storeIcons;
}
break;
default: //默认系统项
if (systemIcons == null)
{
vm.IconInfos = null;
systemIcons = GetSysteIconInfos();
vm.IconInfos = systemIcons;
} else
{
vm.IconInfos = systemIcons;
}
break;
}
}
/// <summary>
/// 获取开始菜单路径下项目
/// </summary>
/// <returns></returns>
private void GetStartMenuInfos()
{
App.Current.Dispatcher.Invoke((Action)(() =>
{
StartMenuLoading.Visibility = Visibility.Visible;
}));
List<IconInfo> infos = new List<IconInfo>();
//获取开始菜单路径
string path = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) + "\\Programs";
//递归获取信息
GetInfos(path, infos);
App.Current.Dispatcher.Invoke((Action)(() =>
{
if (StartMenu.IsSelected)
{
startMenuIcons = infos;
vm.IconInfos = startMenuIcons;
}
StartMenuLoading.Visibility = Visibility.Collapsed;
}));
}
/// <summary>
/// 递归获取文件信息
/// </summary>
/// <param name="path"></param>
/// <param name="listInfos"></param>
private void GetInfos(string path, List<IconInfo> listInfos)
{
DirectoryInfo di = new DirectoryInfo(path);
FileSystemInfo[] fileInfoArr = di.GetFileSystemInfos();
foreach(FileSystemInfo fi in fileInfoArr)
{
path = fi.FullName;
if (File.Exists(path))
{
string ext = Path.GetExtension(path).ToLower();
if (".exe".Equals(ext) || ".lnk".Equals(ext))
{
try
{
IconInfo iconInfo = CommonCode.GetIconInfoByPath_NoWrite(path);
if (iconInfo.Path_NoWrite != null)
{
iconInfo.Content_NoWrite = iconInfo.Path_NoWrite + "\n" + iconInfo.Name_NoWrite;
listInfos.Add(iconInfo);
}
}
catch (Exception) { }
}
}
else if (Directory.Exists(path))
{
GetInfos(path, listInfos);
}
}
}
/// <summary>
/// 获取系统项目
/// </summary>
/// <returns></returns>
private List<IconInfo> GetSysteIconInfos()
{
List<IconInfo> iconInfos = new List<IconInfo>();
Hashtable systemIcons = Constants.SYSTEM_ICONS;
IconInfo iconInfo;
foreach (object key in systemIcons.Keys)
{
string keyStr = key.ToString();
iconInfo = new IconInfo
{
Name_NoWrite = systemIcons[key].ToString()
};
iconInfo.BitmapImage_NoWrite = new BitmapImage(
new Uri("pack://application:,,,/GeekDesk;component/Resource/Image/SystemIcon/" + keyStr + ".png"
, UriKind.RelativeOrAbsolute));
iconInfo.StartArg = keyStr;
iconInfo.Content_NoWrite = iconInfo.Name_NoWrite;
iconInfos.Add(iconInfo);
}
return iconInfos;
}
public class SystemItemViewModel : INotifyPropertyChanged
{
private List<IconInfo> iconInfos;
private AppConfig appConfig;
public SystemItemViewModel()
{
this.AppConfig = MainWindow.appData.AppConfig;
}
public AppConfig AppConfig
{
get
{
return appConfig;
}
set
{
appConfig = value;
OnPropertyChanged("AppConfig");
}
}
public List<IconInfo> IconInfos
{
get
{
return iconInfos;
}
set
{
iconInfos = value;
OnPropertyChanged("IconInfos");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
private static System.Windows.Window window = null;
public static void Show()
{
if (window == null || !window.Activate())
{
window = new SystemItemWindow();
}
window.Show();
Keyboard.Focus(window);
ShowWindowFollowMouse.Show(window, MousePosition.LEFT_CENTER, 0, 0, false);
}
public void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
}
}
}

View File

@@ -4,70 +4,100 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:cvt="clr-namespace:GeekDesk.Converts"
xmlns:local="clr-namespace:GeekDesk" xmlns:local="clr-namespace:GeekDesk"
mc:Ignorable="d" mc:Ignorable="d"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Height="670" Height="450"
Width="450" Width="510"
Title="TaskInfo"
WindowStyle="None" WindowStyle="None"
Title=""
AllowsTransparency="True" AllowsTransparency="True"
Background="Transparent" ShowInTaskbar="False" Background="Transparent" ShowInTaskbar="False"
Focusable="True"
KeyDown="OnKeyDown"
> >
<Window.Resources> <Window.Resources>
<cvt:TodoTaskExecConvert x:Key="TodoTaskExecConvert"/>
</Window.Resources> </Window.Resources>
<Border CornerRadius="3" BorderThickness="2" BorderBrush="Black" Margin="0,0,0,313.323" MouseDown="DragMove">
<Border.Background> <Grid Margin="20">
<SolidColorBrush Color="AliceBlue"/> <Grid.Effect>
</Border.Background> <DropShadowEffect BlurRadius="20" Direction="-90" Color="Gray"
RenderingBias="Quality" ShadowDepth="2"/>
</Grid.Effect>
<Border Style="{StaticResource BorderBG}" MouseDown="DragMove">
<Border.Resources> <Border.Resources>
<Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}"> <Style x:Key="LeftTB" TargetType="TextBlock" BasedOn="{StaticResource TextBlockBaseStyle}">
<Setter Property="Width" Value="65"/> <Setter Property="Width" Value="67"/>
<Setter Property="HorizontalAlignment" Value="Left"/> <Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="FontSize" Value="14"/> <Setter Property="FontSize" Value="14"/>
</Style> </Style>
</Border.Resources> </Border.Resources>
<Grid Margin="0,0,0,8"> <Grid Margin="0,15,0,0">
<hc:SimplePanel Margin="20" HorizontalAlignment="Center"> <StackPanel Margin="20" HorizontalAlignment="Center">
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4">
<WrapPanel> <WrapPanel VerticalAlignment="Center">
<TextBlock Text="待办任务:" Style="{StaticResource LeftTB}"/> <TextBlock Text="待办任务:" Style="{StaticResource LeftTB}"/>
<TextBlock Text="*" Foreground="Red" /> <TextBlock Text="*" Foreground="Red" />
</WrapPanel> </WrapPanel>
<TextBox x:Name="Title" Width="290" FontSize="14" /> <TextBox x:Name="Title" Width="290" Text="{Binding Title, Mode=OneWay}" FontSize="14" />
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4" Margin="0,48.997,0,-48.997"> <hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4" Margin="0,10,0,0">
<TextBlock Text="待办详情:" Style="{StaticResource LeftTB}"/> <TextBlock Text="待办详情:" Style="{StaticResource LeftTB}"/>
<TextBox x:Name="Msg" TextWrapping="Wrap" <TextBox x:Name="Msg" TextWrapping="Wrap"
Margin="5,0,0,0"
Text="{Binding Msg, Mode=OneWay}"
AcceptsReturn="True" AcceptsReturn="True"
VerticalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"
Height="100" MaxHeight="150" MinHeight="100" Width="290" MinWidth="290" Height="100" MaxHeight="150" MinHeight="100" Width="290" MinWidth="290"
VerticalAlignment="Center" HorizontalAlignment="Center"/> VerticalAlignment="Center" HorizontalAlignment="Center"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4" Margin="0,167.622,0,-167.622"> <hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4" Margin="0,10,0,0">
<TextBlock Text="待办时间*:" Style="{StaticResource LeftTB}"/> <TextBlock Text="运行方式:" Style="{StaticResource LeftTB}"/>
<hc:DateTimePicker x:Name="ExeTime" ErrorStr="test" Width="200"/> <RadioButton Margin="10,0,0,0" Checked="ExecType_Checked" Tag="1" Background="{DynamicResource SecondaryRegionBrush}"
Style="{StaticResource RadioButtonIcon}" Content="指定时间"
IsChecked="{Binding ExecType, Mode=OneWay, Converter={StaticResource TodoTaskExecConvert}, ConverterParameter=1}"/>
<RadioButton Margin="10,0,0,0" Checked="ExecType_Checked" Background="{DynamicResource SecondaryRegionBrush}" Tag="2"
Style="{StaticResource RadioButtonIcon}" Content="CRON表达式"
IsChecked="{Binding ExecType, Mode=OneWay, Converter={StaticResource TodoTaskExecConvert}, ConverterParameter=2}"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4" Margin="0,228,0,-228"> <hc:UniformSpacingPanel x:Name="SetTimePanel" Visibility="Visible" Spacing="10" Grid.ColumnSpan="4" Margin="0,10,0,0">
<TextBlock Text="指定时间:" Style="{StaticResource LeftTB}"/>
<TextBlock Text="*" Foreground="Red" Margin="-10,0,0,0"/>
<hc:DateTimePicker x:Name="ExeTime" Text="{Binding ExeTime, Mode=OneWay}" ErrorStr="Error!" Width="200" Margin="-5.2,0,0,0"/>
</hc:UniformSpacingPanel>
<hc:UniformSpacingPanel x:Name="CronPanel" Visibility="Collapsed" Spacing="10" Grid.ColumnSpan="4" Margin="0,10,0,0">
<WrapPanel VerticalAlignment="Center">
<TextBlock Text="CRON:" Style="{StaticResource LeftTB}"/>
<TextBlock Text="*" Foreground="Red" />
</WrapPanel>
<TextBox x:Name="Cron" Width="290" Text="{Binding Cron, Mode=OneWay}" FontSize="14" />
</hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Grid.ColumnSpan="4" Margin="0,10,0,0">
<TextBlock Text="完成时间:" Style="{StaticResource LeftTB}"/> <TextBlock Text="完成时间:" Style="{StaticResource LeftTB}"/>
<TextBlock x:Name="DoneTime" Width="200"/> <TextBlock x:Name="DoneTime" Text="{Binding DoneTime, Mode=OneWay}" Width="200"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
<hc:UniformSpacingPanel Spacing="10" Margin="0,273.333,0,-93.333" Grid.ColumnSpan="4"> <hc:UniformSpacingPanel Spacing="10" Margin="0,10,0,0" Grid.ColumnSpan="4">
<Button Content="保存" Background="#5BC0DE" <Button Content="保存" Style="{StaticResource Btn1}" Margin="320,6,-208,-10"
Foreground="White" Margin="320,6,-208,-10"
Click="Save_Button_Click"/> Click="Save_Button_Click"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
</hc:SimplePanel> </StackPanel>
<Button Panel.ZIndex="2" Width="22" Height="22" Click="Close_Button_Click" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,10,10,0"/> <Button Panel.ZIndex="2" Width="22" Height="22" Click="Close_Button_Click" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,10,10,0"/>
<StackPanel hc:Growl.GrowlParent="True" VerticalAlignment="Top" Margin="0,10,10,0"/> <StackPanel hc:Growl.GrowlParent="True" VerticalAlignment="Top" Margin="0,10,10,0"/>
</Grid> </Grid>
</Border> </Border>
</Grid>
</Window> </Window>

View File

@@ -1,6 +1,9 @@
using GeekDesk.Util; using GeekDesk.Constant;
using GeekDesk.Interface;
using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using HandyControl.Controls; using HandyControl.Controls;
using Quartz;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -20,7 +23,7 @@ namespace GeekDesk.Control.Windows
/// <summary> /// <summary>
/// BacklogInfoWindow.xaml 的交互逻辑 /// BacklogInfoWindow.xaml 的交互逻辑
/// </summary> /// </summary>
public partial class ToDoInfoWindow public partial class ToDoInfoWindow : IWindowCommon
{ {
private static int windowType = -1; private static int windowType = -1;
@@ -29,23 +32,31 @@ namespace GeekDesk.Control.Windows
private AppData appData = MainWindow.appData; private AppData appData = MainWindow.appData;
private ToDoInfo info; //private ToDoInfo info;
private ToDoInfoWindow() private ToDoInfoWindow()
{ {
InitializeComponent(); InitializeComponent();
ExeTime.SelectedDateTime = DateTime.Now.AddMinutes(10);
this.Topmost = true; this.Topmost = true;
DateTime time = DateTime.Now.AddMinutes(10);
ExeTime.SelectedDateTime = time;
SetTimePanel.Visibility = Visibility.Visible;
this.DataContext = new ToDoInfo {
ExeTime = time.ToString("yyyy-MM-dd HH:mm:ss")
};
} }
private ToDoInfoWindow(ToDoInfo info) private ToDoInfoWindow(ToDoInfo info)
{ {
InitializeComponent(); InitializeComponent();
this.Topmost = true; this.Topmost = true;
Title.Text = info.Title; this.DataContext = info;
Msg.Text = info.Msg; SetTimePanel.Visibility = Visibility.Visible;
ExeTime.Text = info.ExeTime; //Title.Text = info.Title;
DoneTime.Text = info.DoneTime; //Msg.Text = info.Msg;
this.info = info; //ExeTime.Text = info.ExeTime;
//DoneTime.Text = info.DoneTime;
//this.info = info;
} }
@@ -79,41 +90,70 @@ namespace GeekDesk.Control.Windows
/// <param name="e"></param> /// <param name="e"></param>
private void Save_Button_Click(object sender, RoutedEventArgs e) private void Save_Button_Click(object sender, RoutedEventArgs e)
{ {
DateTime dt; DateTime dt;
if (Title.Text.Trim() == "" || ExeTime.Text.Trim() == "") string execTime;
TodoTaskExecType execType;
if (Title.Text.Trim() == "")
{ {
Growl.Warning("任务标题 和 待办时间不能为空!"); Growl.Warning("任务标题不能为空!");
return; return;
} else } else
{ {
if (SetTimePanel.Visibility == Visibility.Visible)
{
execType = TodoTaskExecType.SET_TIME;
if (ExeTime.Text.Trim() == "")
{
Growl.Warning("执行时间不能为空!");
return;
}
try try
{ {
dt = Convert.ToDateTime(ExeTime.Text); dt = Convert.ToDateTime(ExeTime.Text);
} catch (Exception) }
catch (Exception)
{ {
Growl.Warning("请输入正确的时间!"); Growl.Warning("请输入正确的时间!");
return; return;
} }
} execTime = ExeTime.Text;
if (windowType == NEW_TODO) } else {
execType = TodoTaskExecType.CRON;
if (Cron.Text.Trim() == "")
{ {
info = new ToDoInfo Growl.Warning("Cron表达式不能为空!");
return;
}
try
{
bool isValid = CronExpression.IsValidExpression(Cron.Text);
if (!isValid) throw new Exception();
} catch (Exception)
{
Growl.Warning("请输入正确的Cron表达式!");
return;
}
CronExpression exp = new CronExpression(Cron.Text);
DateTime dd = DateTime.Now;
DateTimeOffset ddo = DateTime.SpecifyKind(dd, DateTimeKind.Local);
ddo = (DateTimeOffset)exp.GetNextValidTimeAfter(ddo);
execTime = ddo.LocalDateTime.ToString("yyyy-MM-dd HH:mm:ss");
}
}
dt = Convert.ToDateTime(execTime);
ToDoInfo info = new ToDoInfo
{ {
Title = Title.Text, Title = Title.Text,
Msg = Msg.Text, Msg = Msg.Text,
ExeTime = ExeTime.Text ExeTime = execTime,
ExecType = execType,
Cron = Cron.Text
}; };
appData.ToDoList.Add(info); if (windowType != NEW_TODO)
} else
{ {
appData.HiToDoList.Remove(info); appData.HiToDoList.Remove(this.DataContext as ToDoInfo);
info.Title = Title.Text;
info.Msg = Msg.Text;
info.ExeTime = ExeTime.Text;
info.DoneTime = null;
appData.ToDoList.Add(info);
} }
appData.ToDoList.Add(info);
DateTime dtNow = DateTime.Now; DateTime dtNow = DateTime.Now;
TimeSpan ts = dt.Subtract(dtNow); TimeSpan ts = dt.Subtract(dtNow);
@@ -149,6 +189,18 @@ namespace GeekDesk.Control.Windows
window.Visibility = Visibility.Visible; window.Visibility = Visibility.Visible;
} }
public static void ShowOrHide()
{
if (window == null || !window.Activate())
{
window = new ToDoInfoWindow();
window.Show();
} else
{
window.Close();
}
}
public static System.Windows.Window GetThis() public static System.Windows.Window GetThis()
{ {
@@ -156,6 +208,7 @@ namespace GeekDesk.Control.Windows
{ {
window = new ToDoInfoWindow(); window = new ToDoInfoWindow();
window.Show(); window.Show();
Keyboard.Focus(window);
} }
window.Visibility = Visibility.Collapsed; window.Visibility = Visibility.Collapsed;
windowType = NEW_TODO; windowType = NEW_TODO;
@@ -171,6 +224,31 @@ namespace GeekDesk.Control.Windows
} }
windowType = DETAIL_TODO; windowType = DETAIL_TODO;
window2.Show(); window2.Show();
Keyboard.Focus(window2);
}
private void ExecType_Checked(object sender, RoutedEventArgs e)
{
TodoTaskExecType tag = (TodoTaskExecType)Convert.ToInt32((sender as RadioButton).Tag.ToString());
switch (tag)
{
case TodoTaskExecType.SET_TIME:
SetTimePanel.Visibility = Visibility.Visible;
CronPanel.Visibility = Visibility.Collapsed;
break;
default:
CronPanel.Visibility = Visibility.Visible;
SetTimePanel.Visibility = Visibility.Collapsed;
break;
}
}
public void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
} }
} }
} }

View File

@@ -7,32 +7,23 @@
xmlns:local="clr-namespace:GeekDesk" xmlns:local="clr-namespace:GeekDesk"
mc:Ignorable="d" mc:Ignorable="d"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Height="450" Height="550"
Width="850" Width="1000"
Title="Task" Title="Task"
WindowStyle="None" WindowStyle="None"
AllowsTransparency="True" AllowsTransparency="True"
Background="Transparent" ShowInTaskbar="False" Background="Transparent" ShowInTaskbar="False"
Focusable="True"
KeyDown="OnKeyDown"
> >
<Window.Resources>
<Style x:Key="MenuStyle" TargetType="hc:SideMenuItem" BasedOn="{StaticResource SideMenuItemBaseStyle}"> <Grid Margin="50">
<Style.Setters> <Grid.Effect>
<Setter Property="Background" Value="AliceBlue"/> <DropShadowEffect BlurRadius="20" Direction="-90" Color="Gray"
</Style.Setters> RenderingBias="Quality" ShadowDepth="2"/>
<Style.Triggers> </Grid.Effect>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FFE2E2E2"/> <Border Style="{StaticResource BorderBG}">
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#FFDAD7D7"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Border CornerRadius="4" BorderThickness="0">
<Border.Background>
<SolidColorBrush Color="AliceBlue" Opacity="0.9"/>
</Border.Background>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
@@ -42,16 +33,15 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<hc:Card Grid.Row="0" Grid.Column="0"> <hc:Card Grid.Row="0" Grid.Column="0" Background="Transparent" BorderThickness="0">
<hc:SideMenu BorderThickness="1" <hc:SideMenu BorderThickness="0"
AutoSelect="True" AutoSelect="True"
Background="Transparent"
Margin="5"
> >
<hc:SideMenu.Background>
<SolidColorBrush Color="AliceBlue"/>
</hc:SideMenu.Background>
<hc:SideMenu.ItemContainerStyle> <hc:SideMenu.ItemContainerStyle>
<Style TargetType="hc:SideMenuItem" BasedOn="{StaticResource MenuStyle}"/> <Style TargetType="hc:SideMenuItem" BasedOn="{StaticResource MyMenuStyle}"/>
</hc:SideMenu.ItemContainerStyle> </hc:SideMenu.ItemContainerStyle>
<hc:SideMenuItem Header="待办列表" <hc:SideMenuItem Header="待办列表"
@@ -88,17 +78,18 @@
</hc:SideMenuItem> </hc:SideMenuItem>
</hc:SideMenu> </hc:SideMenu>
</hc:Card> </hc:Card>
<hc:Card Grid.Row="0" Grid.Column="1" x:Name="RightCard" Height="450" MouseDown="DragMove" /> <hc:Card Grid.Row="0" MouseDown="DragMove" Background="Transparent" BorderThickness="0" Grid.Column="1" x:Name="RightCard" Height="450">
</hc:Card>
<Button Width="22" Height="22" Click="Close_Button_Click" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,10,10,0" Grid.Column="1"/> <Button Width="22" Height="22" Click="Close_Button_Click" Style="{StaticResource ButtonIcon}" Foreground="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" hc:IconElement.Geometry="{StaticResource ErrorGeometry}" Padding="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,10,10,0" Grid.Column="1"/>
<Button Content="新建待办" <Button Content="新建待办"
Panel.ZIndex="1" Panel.ZIndex="1"
Background="#5BC0DE" Style="{StaticResource Btn1}"
Foreground="White"
Grid.Column="1" Grid.Column="1"
Margin="590.01,29,10,384" Margin="590.01,29,10,384"
Click="CreateBacklog_BtnClick"/> Click="CreateBacklog_BtnClick"/>
</Grid> </Grid>
</Border> </Border>
</Grid>
</Window> </Window>

View File

@@ -1,4 +1,5 @@
using GeekDesk.Control.UserControls.Backlog; using GeekDesk.Control.UserControls.Backlog;
using GeekDesk.Interface;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using HandyControl.Controls; using HandyControl.Controls;
using System; using System;
@@ -21,7 +22,7 @@ namespace GeekDesk.Control.Windows
/// <summary> /// <summary>
/// BacklogWindow.xaml 的交互逻辑 /// BacklogWindow.xaml 的交互逻辑
/// </summary> /// </summary>
public partial class ToDoWindow public partial class ToDoWindow : IWindowCommon
{ {
private static TodoControl backlog = new TodoControl(); private static TodoControl backlog = new TodoControl();
private AppData appData = MainWindow.appData; private AppData appData = MainWindow.appData;
@@ -64,9 +65,11 @@ namespace GeekDesk.Control.Windows
{ {
case "History": case "History":
backlog.BacklogList.ItemsSource = appData.HiToDoList; backlog.BacklogList.ItemsSource = appData.HiToDoList;
backlog.type = ToDoType.HISTORY;
break; break;
default: default:
backlog.BacklogList.ItemsSource = appData.ToDoList; backlog.BacklogList.ItemsSource = appData.ToDoList;
backlog.type = ToDoType.NEW;
break; break;
} }
} }
@@ -83,15 +86,24 @@ namespace GeekDesk.Control.Windows
private static System.Windows.Window window = null; private static System.Windows.Window window = null;
#pragma warning disable CS0108 // “ToDoWindow.Show()”隐藏继承的成员“Window.Show()”。如果是有意隐藏,请使用关键字 new。
public static void Show() public static void Show()
#pragma warning restore CS0108 // “ToDoWindow.Show()”隐藏继承的成员“Window.Show()”。如果是有意隐藏,请使用关键字 new。
{ {
if (window == null || !window.Activate()) if (window == null || !window.Activate())
{ {
window = new ToDoWindow(); window = new ToDoWindow();
} }
window.Show(); window.Show();
Keyboard.Focus(window);
} }
public void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
}
} }
} }

View File

@@ -6,23 +6,35 @@
xmlns:local="clr-namespace:GeekDesk.Control.Windows" xmlns:local="clr-namespace:GeekDesk.Control.Windows"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d" mc:Ignorable="d"
Title="UpdateWindow" Height="300" Width="450" Height="460" Width="610"
WindowStyle="None" WindowStyle="None"
AllowsTransparency="True" AllowsTransparency="True"
Background="Transparent" ShowInTaskbar="False"> Title=""
<Border CornerRadius="4" Background="AliceBlue" BorderThickness="1" BorderBrush="Green" MouseDown="DragMove"> Background="Transparent" ShowInTaskbar="False"
Focusable="True"
KeyDown="OnKeyDown">
<Grid Margin="20">
<Grid.Effect>
<DropShadowEffect BlurRadius="30" Direction="-90" Color="Gray"
RenderingBias="Quality" ShadowDepth="2"/>
</Grid.Effect>
<Border CornerRadius="4" Background="White" BorderThickness="0" MouseDown="DragMove">
<StackPanel HorizontalAlignment="Center"> <StackPanel HorizontalAlignment="Center">
<hc:Card BorderThickness="0" Effect="{DynamicResource EffectShadow2}" Margin="20,20,20,0"> <hc:Card BorderThickness="0" Effect="{DynamicResource EffectShadow2}" Margin="20,20,20,0">
<!--Card 的内容部分--> <!--Card 的内容部分-->
<Border CornerRadius="4,4,0,0" Height="160"> <Border CornerRadius="4,4,0,0" Height="260">
<StackPanel> <StackPanel>
<TextBlock Margin="10" x:Name="MsgTitle" TextWrapping="Wrap" FontSize="16" HorizontalAlignment="Left" Style="{DynamicResource TextBlockLargeBold}" Text="测试"/> <TextBlock Margin="10" x:Name="MsgTitle" TextWrapping="Wrap" FontSize="16" HorizontalAlignment="Left" Style="{DynamicResource TextBlockLargeBold}" Text="测试"/>
<TextBlock Margin="15" x:Name="Msg" TextWrapping="Wrap" VerticalAlignment="Center" Text=""/> <StackPanel x:Name="MsgPanel">
<hc:ScrollViewer x:Name="MsgBar" HorizontalScrollBarVisibility="Visible" IsInertiaEnabled="True" Margin="10" Width="430">
<TextBlock Width="430" FontSize="15" LineHeight="22" x:Name="Msg" TextWrapping="Wrap" VerticalAlignment="Center" Text="测试"/>
</hc:ScrollViewer>
</StackPanel>
</StackPanel> </StackPanel>
</Border> </Border>
<!--Card 的尾部部分--> <!--Card 的尾部部分-->
<hc:Card.Footer> <hc:Card.Footer>
<StackPanel Margin="10" Width="420"> <StackPanel Margin="10" Width="520">
<!--Card 的一级内容--> <!--Card 的一级内容-->
<TextBlock TextWrapping="NoWrap" x:Name="Title" Style="{DynamicResource TextBlockLargeBold}" TextTrimming="CharacterEllipsis" <TextBlock TextWrapping="NoWrap" x:Name="Title" Style="{DynamicResource TextBlockLargeBold}" TextTrimming="CharacterEllipsis"
Text="" Text=""
@@ -36,9 +48,10 @@
</hc:Card> </hc:Card>
<hc:UniformSpacingPanel Spacing="100" HorizontalAlignment="Center" Margin="0,10,0,0"> <hc:UniformSpacingPanel Spacing="100" HorizontalAlignment="Center" Margin="0,10,0,0">
<Button Content="暂不更新" Click="Close_Click" /> <Button Content="暂不更新" Click="Close_Click" />
<Button Content="前往更新" Click="Confirm_Click" Background="#5BC0DE" Foreground="White" RenderTransformOrigin="0.696,0.45"/> <Button Content="前往更新" Click="Confirm_Click" Style="{StaticResource Btn1}"/>
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
</StackPanel> </StackPanel>
</Border> </Border>
</Grid>
</Window> </Window>

View File

@@ -1,4 +1,5 @@
using GeekDesk.Constant; using GeekDesk.Constant;
using GeekDesk.Interface;
using GeekDesk.Util; using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
@@ -23,7 +24,7 @@ namespace GeekDesk.Control.Windows
/// <summary> /// <summary>
/// UpdateWindow.xaml 的交互逻辑 /// UpdateWindow.xaml 的交互逻辑
/// </summary> /// </summary>
public partial class UpdateWindow : Window public partial class UpdateWindow : Window, IWindowCommon
{ {
private static AppConfig appConfig = MainWindow.appData.AppConfig; private static AppConfig appConfig = MainWindow.appData.AppConfig;
private static string githubUrl = ""; private static string githubUrl = "";
@@ -33,12 +34,13 @@ namespace GeekDesk.Control.Windows
try try
{ {
WindowStartupLocation = WindowStartupLocation.CenterScreen; WindowStartupLocation = WindowStartupLocation.CenterScreen;
this.Topmost = true;
InitializeComponent(); InitializeComponent();
DataHandle(jo); DataHandle(jo);
} }
catch (Exception) catch (Exception e)
{ {
LogUtil.WriteErrorLog(e, "更新信息格式化失败!");
} }
} }
@@ -102,6 +104,15 @@ namespace GeekDesk.Control.Windows
window = new UpdateWindow(jo); window = new UpdateWindow(jo);
} }
window.Show(); window.Show();
Keyboard.Focus(window);
}
public void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
} }
} }
} }

View File

@@ -0,0 +1,45 @@
using GeekDesk.Constant;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace GeekDesk.Converts
{
public class MenuInfoConvert : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int menuIndex = MainWindow.appData.AppConfig.SelectedMenuIndex;
if (menuIndex == -1)
{
return "";
} else
{
string type = parameter.ToString();
if ("1".Equals(type))
{
return MainWindow.appData.MenuList[menuIndex].MenuGeometry;
}
else
{
return MainWindow.appData.MenuList[menuIndex].MenuName;
}
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
//bool isChecked = (bool)value;
//if (!isChecked)
//{
// return null;
//}
//return (AppHideType)int.Parse(parameter.ToString());
}
}
}

View File

@@ -10,7 +10,9 @@ namespace GeekDesk.Converts
{ {
if (value != null && value.ToString().Length > 0) if (value != null && value.ToString().Length > 0)
{ {
return System.Convert.ToDouble(value.ToString()) - 10d; if (parameter == null) parameter = 0.00;
double p = System.Convert.ToDouble(parameter.ToString());
return System.Convert.ToDouble(value.ToString()) - p;
} }
else else
{ {

View File

@@ -0,0 +1,29 @@
using GeekDesk.Constant;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace GeekDesk.Converts
{
public class TodoTaskExecConvert : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (TodoTaskExecType)value == (TodoTaskExecType)int.Parse(parameter.ToString());
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
bool isChecked = (bool)value;
if (!isChecked)
{
return null;
}
return (TodoTaskExecType)int.Parse(parameter.ToString());
}
}
}

View File

@@ -26,6 +26,8 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Prefer32Bit>false</Prefer32Bit>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
@@ -56,19 +58,50 @@
<Reference Include="CommonServiceLocator, Version=2.0.6.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL"> <Reference Include="CommonServiceLocator, Version=2.0.6.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>packages\CommonServiceLocator.2.0.6\lib\net45\CommonServiceLocator.dll</HintPath> <HintPath>packages\CommonServiceLocator.2.0.6\lib\net45\CommonServiceLocator.dll</HintPath>
</Reference> </Reference>
<Reference Include="HandyControl, Version=3.1.0.0, Culture=neutral, PublicKeyToken=45be8712787a1e5b, processorArchitecture=MSIL"> <Reference Include="Gma.System.MouseKeyHook, Version=5.6.130.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\HandyControl.3.1.0\lib\net472\HandyControl.dll</HintPath> <HintPath>packages\MouseKeyHook.5.6.0\lib\net40\Gma.System.MouseKeyHook.dll</HintPath>
</Reference>
<Reference Include="HandyControl, Version=3.3.0.0, Culture=neutral, PublicKeyToken=45be8712787a1e5b, processorArchitecture=MSIL">
<HintPath>packages\HandyControl.3.3.0\lib\net472\HandyControl.dll</HintPath>
</Reference>
<Reference Include="KeyMouseHook, Version=1.0.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\KeyMouseHook.1.0.6\lib\net40\KeyMouseHook.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Extensions.Logging.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="Quartz, Version=3.3.3.0, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4, processorArchitecture=MSIL">
<HintPath>packages\Quartz.3.3.3\lib\net472\Quartz.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Drawing.Common, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="System.Drawing.Common, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Drawing.Common.6.0.0-preview.6.21352.12\lib\net461\System.Drawing.Common.dll</HintPath> <HintPath>packages\System.Drawing.Common.6.0.0-preview.6.21352.12\lib\net461\System.Drawing.Common.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Remoting" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
@@ -92,9 +125,11 @@
<Compile Include="Command\DelegateCommandBase.cs" /> <Compile Include="Command\DelegateCommandBase.cs" />
<Compile Include="Constant\AppHideType.cs" /> <Compile Include="Constant\AppHideType.cs" />
<Compile Include="Constant\Constants.cs" /> <Compile Include="Constant\Constants.cs" />
<Compile Include="Constant\MainWindowEnum.cs" /> <Compile Include="Constant\IconType.cs" />
<Compile Include="Constant\CommonEnum.cs" />
<Compile Include="Constant\IconStartType.cs" /> <Compile Include="Constant\IconStartType.cs" />
<Compile Include="Constant\SortType.cs" /> <Compile Include="Constant\SortType.cs" />
<Compile Include="Constant\TodoTaskExecType.cs" />
<Compile Include="Constant\UpdateType.cs" /> <Compile Include="Constant\UpdateType.cs" />
<Compile Include="Control\Other\BacklogNotificatin.xaml.cs"> <Compile Include="Control\Other\BacklogNotificatin.xaml.cs">
<DependentUpon>BacklogNotificatin.xaml</DependentUpon> <DependentUpon>BacklogNotificatin.xaml</DependentUpon>
@@ -102,15 +137,24 @@
<Compile Include="Control\Other\CustomIconUrlDialog.xaml.cs"> <Compile Include="Control\Other\CustomIconUrlDialog.xaml.cs">
<DependentUpon>CustomIconUrlDialog.xaml</DependentUpon> <DependentUpon>CustomIconUrlDialog.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Control\Other\IconInfoUrlDialog.xaml.cs">
<DependentUpon>IconInfoUrlDialog.xaml</DependentUpon>
</Compile>
<Compile Include="Control\UserControls\Config\OtherControl.xaml.cs"> <Compile Include="Control\UserControls\Config\OtherControl.xaml.cs">
<DependentUpon>OtherControl.xaml</DependentUpon> <DependentUpon>OtherControl.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Control\UserControls\SystemItem\SystemItem.xaml.cs">
<DependentUpon>SystemItem.xaml</DependentUpon>
</Compile>
<Compile Include="Control\UserControls\ToDo\TodoControl.xaml.cs"> <Compile Include="Control\UserControls\ToDo\TodoControl.xaml.cs">
<DependentUpon>TodoControl.xaml</DependentUpon> <DependentUpon>TodoControl.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Control\UserControls\IconFont\IconPannel.xaml.cs"> <Compile Include="Control\UserControls\IconFont\IconPannel.xaml.cs">
<DependentUpon>IconPannel.xaml</DependentUpon> <DependentUpon>IconPannel.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Control\Windows\SystemItemWindow.xaml.cs">
<DependentUpon>SystemItemWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Control\Windows\ToDoInfoWindow.xaml.cs"> <Compile Include="Control\Windows\ToDoInfoWindow.xaml.cs">
<DependentUpon>ToDoInfoWindow.xaml</DependentUpon> <DependentUpon>ToDoInfoWindow.xaml</DependentUpon>
</Compile> </Compile>
@@ -123,9 +167,6 @@
<Compile Include="Control\Other\IconInfoDialog.xaml.cs"> <Compile Include="Control\Other\IconInfoDialog.xaml.cs">
<DependentUpon>IconInfoDialog.xaml</DependentUpon> <DependentUpon>IconInfoDialog.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Control\Other\MenuGeometryDialog.xaml.cs">
<DependentUpon>MenuGeometryDialog.xaml</DependentUpon>
</Compile>
<Compile Include="Control\UserControls\Config\AboutControl.xaml.cs"> <Compile Include="Control\UserControls\Config\AboutControl.xaml.cs">
<DependentUpon>AboutControl.xaml</DependentUpon> <DependentUpon>AboutControl.xaml</DependentUpon>
</Compile> </Compile>
@@ -148,21 +189,28 @@
<DependentUpon>UpdateWindow.xaml</DependentUpon> <DependentUpon>UpdateWindow.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Converts\DoubleToGridLength.cs" /> <Compile Include="Converts\DoubleToGridLength.cs" />
<Compile Include="Converts\MenuInfoConvert.cs" />
<Compile Include="Converts\TodoTaskExecConvert.cs" />
<Compile Include="Converts\IntToCornerRadius.cs" /> <Compile Include="Converts\IntToCornerRadius.cs" />
<Compile Include="Converts\OpcityConvert.cs" /> <Compile Include="Converts\OpcityConvert.cs" />
<Compile Include="Converts\UpdateTypeConvert.cs" /> <Compile Include="Converts\UpdateTypeConvert.cs" />
<Compile Include="DraggAnimatedPanel\DraggAnimatedPanel.cs" /> <Compile Include="DraggAnimatedPanel\DraggAnimatedPanel.cs" />
<Compile Include="DraggAnimatedPanel\DraggAnimatedPanel.Drag.cs" /> <Compile Include="DraggAnimatedPanel\DraggAnimatedPanel.Drag.cs" />
<Compile Include="Converts\HideTypeConvert.cs" /> <Compile Include="Converts\HideTypeConvert.cs" />
<Compile Include="Interface\IWindowCommon.cs" />
<Compile Include="Task\ToDoTask.cs" /> <Compile Include="Task\ToDoTask.cs" />
<Compile Include="Thread\MouseHookThread.cs" />
<Compile Include="Thread\DispatcherBuild.cs" />
<Compile Include="Thread\UpdateThread.cs" /> <Compile Include="Thread\UpdateThread.cs" />
<Compile Include="Util\AeroGlassHelper.cs" /> <Compile Include="Util\AeroGlassHelper.cs" />
<Compile Include="Util\GlobalHotKey.cs" />
<Compile Include="Util\CommonCode.cs" /> <Compile Include="Util\CommonCode.cs" />
<Compile Include="Util\ConsoleManager.cs" /> <Compile Include="Util\ConsoleManager.cs" />
<Compile Include="Util\DragAdorner.cs" /> <Compile Include="Util\DragAdorner.cs" />
<Compile Include="Util\FileIcon.cs" /> <Compile Include="Util\FileIcon.cs" />
<Compile Include="Util\FileUtil.cs" /> <Compile Include="Util\FileUtil.cs" />
<Compile Include="Util\HotKey.cs" /> <Compile Include="Util\LogUtil.cs" />
<Compile Include="Util\MarginHide.cs" />
<Compile Include="Util\HttpUtil.cs" /> <Compile Include="Util\HttpUtil.cs" />
<Compile Include="Util\ImageUtil.cs" /> <Compile Include="Util\ImageUtil.cs" />
<Compile Include="Util\ListViewDragDropManager.cs" /> <Compile Include="Util\ListViewDragDropManager.cs" />
@@ -171,8 +219,10 @@
<Compile Include="Util\MouseUtilities.cs" /> <Compile Include="Util\MouseUtilities.cs" />
<Compile Include="Util\RegisterUtil.cs" /> <Compile Include="Util\RegisterUtil.cs" />
<Compile Include="Util\ShellContextMenu.cs" /> <Compile Include="Util\ShellContextMenu.cs" />
<Compile Include="Util\ShowWindowFollowMouse.cs" />
<Compile Include="Util\StringUtil.cs" /> <Compile Include="Util\StringUtil.cs" />
<Compile Include="Util\SvgToGeometry.cs" /> <Compile Include="Util\SvgToGeometry.cs" />
<Compile Include="Util\SystemIcon.cs" />
<Compile Include="ViewModel\AppConfig.cs" /> <Compile Include="ViewModel\AppConfig.cs" />
<Compile Include="ViewModel\AppData.cs" /> <Compile Include="ViewModel\AppData.cs" />
<Compile Include="ViewModel\ToDoInfo.cs" /> <Compile Include="ViewModel\ToDoInfo.cs" />
@@ -187,10 +237,18 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Page> </Page>
<Page Include="Control\Other\IconInfoUrlDialog.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Control\UserControls\Config\OtherControl.xaml"> <Page Include="Control\UserControls\Config\OtherControl.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="Control\UserControls\SystemItem\SystemItem.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Control\UserControls\ToDo\TodoControl.xaml"> <Page Include="Control\UserControls\ToDo\TodoControl.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
@@ -199,6 +257,10 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="Control\Windows\SystemItemWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Control\Windows\ToDoInfoWindow.xaml"> <Page Include="Control\Windows\ToDoInfoWindow.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
@@ -215,10 +277,6 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="Control\Other\MenuGeometryDialog.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Control\UserControls\Config\AboutControl.xaml"> <Page Include="Control\UserControls\Config\AboutControl.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
@@ -263,6 +321,10 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="Resource\Dictionary\CommonStyle.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs"> <Compile Include="Properties\AssemblyInfo.cs">
@@ -323,6 +385,35 @@
<Isolated>False</Isolated> <Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes> <EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference> </COMReference>
<COMReference Include="Shell32">
<Guid>{50A7E9B0-70EF-11D1-B75A-00A0C90564FE}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<ItemGroup>
<Resource Include="Resource\Image\SystemIcon\Calculator.png" />
<Resource Include="Resource\Image\SystemIcon\Computer.png" />
<Resource Include="Resource\Image\SystemIcon\GroupPolicy.png" />
<Resource Include="Resource\Image\SystemIcon\Network.png" />
<Resource Include="Resource\Image\SystemIcon\RecycleBin.png" />
<Resource Include="Resource\Image\SystemIcon\Registry.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Resource\Image\SystemIcon\Notepad.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Resource\Image\SystemIcon\Mstsc.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Resource\Image\SystemIcon\Control.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Resource\Image\SystemIcon\CMD.png" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> </Project>

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
namespace GeekDesk.Interface
{
public interface IWindowCommon
{
void OnKeyDown(object sender, KeyEventArgs e);
}
}

View File

@@ -9,18 +9,22 @@
xmlns:cvt="clr-namespace:GeekDesk.Converts" xmlns:cvt="clr-namespace:GeekDesk.Converts"
xmlns:DraggAnimatedPanel="clr-namespace:DraggAnimatedPanel" xmlns:DraggAnimatedPanel="clr-namespace:DraggAnimatedPanel"
x:Name="window" x:Name="window"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:viewmodel="clr-namespace:GeekDesk.ViewModel" d:DataContext="{d:DesignInstance Type=viewmodel:AppData}"
Title="GeekDesk" Title="GeekDesk"
d:DesignHeight="500" d:DesignWidth="700" MinWidth="600"
MinHeight="400"
WindowStyle="None" WindowStyle="None"
AllowsTransparency="True" AllowsTransparency="True"
Background="Transparent" Background="Transparent"
OpacityMask ="White" ShowInTaskbar="False"
Deactivated="window_Deactivated" Opacity="0"
SizeChanged="window_SizeChanged" Deactivated="Window_Deactivated"
SizeChanged="Window_SizeChanged"
KeyDown="OnKeyDown"
Focusable="True"
> >
<WindowChrome.WindowChrome> <WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="0" ResizeBorderThickness="10"/> <WindowChrome CaptionHeight="0" ResizeBorderThickness="15"/>
</WindowChrome.WindowChrome> </WindowChrome.WindowChrome>
<Window.Resources> <Window.Resources>
@@ -30,10 +34,18 @@
<cvt:DoubleToGridLength x:Key="DoubleToGridLength"/> <cvt:DoubleToGridLength x:Key="DoubleToGridLength"/>
</Window.Resources> </Window.Resources>
<Window.Effect>
<Border CornerRadius="{Binding AppConfig.PannelCornerRadius, Mode=TwoWay, Converter={StaticResource IntToCornerRadius}}" BorderThickness="0" <DropShadowEffect BlurRadius="30" Direction="-90" Color="Gray"
RenderingBias="Quality" ShadowDepth="2"/>
</Window.Effect>
<Border Margin="20" CornerRadius="{Binding AppConfig.PannelCornerRadius, Mode=TwoWay, Converter={StaticResource IntToCornerRadius}}" BorderThickness="0"
Background="AliceBlue" LostFocus="App_LostFocus" Background="AliceBlue" LostFocus="App_LostFocus"
Opacity="{Binding AppConfig.PannelOpacity, Mode=TwoWay, Converter={StaticResource OpcityConvert}}"> Opacity="{Binding AppConfig.PannelOpacity, Mode=TwoWay, Converter={StaticResource OpcityConvert}}"
VirtualizingPanel.VirtualizationMode="Recycling" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.IsContainerVirtualizable="True"
hc:Dialog.Token="IconInfoDialog"
>
<hc:DialogContainer>
<Border CornerRadius="{Binding AppConfig.PannelCornerRadius, Mode=TwoWay, Converter={StaticResource IntToCornerRadius}}" BorderThickness="0"> <Border CornerRadius="{Binding AppConfig.PannelCornerRadius, Mode=TwoWay, Converter={StaticResource IntToCornerRadius}}" BorderThickness="0">
<!--背景图片--> <!--背景图片-->
<Border.Background> <Border.Background>
@@ -48,8 +60,8 @@
</Grid> </Grid>
</VisualBrush.Visual> </VisualBrush.Visual>
</VisualBrush> </VisualBrush>
<!--<ImageBrush ImageSource="{Binding AppConfig.BitmapImage}" Opacity="{Binding AppConfig.BgOpacity, Mode=TwoWay, Converter={StaticResource OpcityConvert}}"></ImageBrush>-->
</Border.Background> </Border.Background>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="40" MouseMove="DragMove"></RowDefinition> <RowDefinition Height="40" MouseMove="DragMove"></RowDefinition>
@@ -61,6 +73,7 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<DockPanel Grid.Row="0" Grid.Column="0" MouseMove="DragMove"> <DockPanel Grid.Row="0" Grid.Column="0" MouseMove="DragMove">
<DockPanel.Background> <DockPanel.Background>
<SolidColorBrush Opacity="0.01"/> <SolidColorBrush Opacity="0.01"/>
@@ -72,7 +85,7 @@
<DockPanel.Background> <DockPanel.Background>
<SolidColorBrush Opacity="0.01"/> <SolidColorBrush Opacity="0.01"/>
</DockPanel.Background> </DockPanel.Background>
<hc:UniformSpacingPanel Spacing="0" Grid.ColumnSpan="4" HorizontalAlignment="Right" VerticalAlignment="Center"> <hc:UniformSpacingPanel Grid.ColumnSpan="4" HorizontalAlignment="Right" VerticalAlignment="Center">
<Button Background="Transparent" <Button Background="Transparent"
BorderThickness="0" BorderThickness="0"
hc:IconElement.Geometry="M917.930667 512c0-57.6 36.181333-106.496 86.869333-125.952a505.429333 505.429333 0 0 0-55.210667-133.461333A134.826667 134.826667 0 0 1 771.413333 74.410667 507.733333 507.733333 0 0 0 637.952 19.2 135.168 135.168 0 0 1 512 106.069333 134.912 134.912 0 0 1 386.048 19.2 505.429333 505.429333 0 0 0 252.586667 74.410667c22.186667 49.749333 13.141333 109.824-27.562667 150.528a135.168 135.168 0 0 1-150.528 27.648 502.016 502.016 0 0 0-55.296 133.461333c50.688 19.626667 86.869333 68.437333 86.869333 125.952 0 57.6-36.181333 106.496-86.869333 125.952 12.117333 47.530667 30.72 92.330667 55.210667 133.461333a134.826667 134.826667 0 0 1 178.090666 178.176 507.733333 507.733333 0 0 0 133.546667 55.210667A135.168 135.168 0 0 1 512 917.930667c57.6 0 106.496 36.181333 125.952 86.869333a505.429333 505.429333 0 0 0 133.461333-55.210667 134.912 134.912 0 0 1 27.562667-150.528 135.168 135.168 0 0 1 150.528-27.648 502.016 502.016 0 0 0 55.296-133.461333A134.912 134.912 0 0 1 917.930667 512zM512 647.338667a135.338667 135.338667 0 1 1 0.085333-270.762667A135.338667 135.338667 0 0 1 512 647.338667z" hc:IconElement.Geometry="M917.930667 512c0-57.6 36.181333-106.496 86.869333-125.952a505.429333 505.429333 0 0 0-55.210667-133.461333A134.826667 134.826667 0 0 1 771.413333 74.410667 507.733333 507.733333 0 0 0 637.952 19.2 135.168 135.168 0 0 1 512 106.069333 134.912 134.912 0 0 1 386.048 19.2 505.429333 505.429333 0 0 0 252.586667 74.410667c22.186667 49.749333 13.141333 109.824-27.562667 150.528a135.168 135.168 0 0 1-150.528 27.648 502.016 502.016 0 0 0-55.296 133.461333c50.688 19.626667 86.869333 68.437333 86.869333 125.952 0 57.6-36.181333 106.496-86.869333 125.952 12.117333 47.530667 30.72 92.330667 55.210667 133.461333a134.826667 134.826667 0 0 1 178.090666 178.176 507.733333 507.733333 0 0 0 133.546667 55.210667A135.168 135.168 0 0 1 512 917.930667c57.6 0 106.496 36.181333 125.952 86.869333a505.429333 505.429333 0 0 0 133.461333-55.210667 134.912 134.912 0 0 1 27.562667-150.528 135.168 135.168 0 0 1 150.528-27.648 502.016 502.016 0 0 0 55.296-133.461333A134.912 134.912 0 0 1 917.930667 512zM512 647.338667a135.338667 135.338667 0 1 1 0.085333-270.762667A135.338667 135.338667 0 0 1 512 647.338667z"
@@ -82,6 +95,7 @@
Click="ConfigButtonClick" Click="ConfigButtonClick"
Initialized="SettingButton_Initialized" Initialized="SettingButton_Initialized"
x:Name="SettingButton" x:Name="SettingButton"
FocusVisualStyle="{x:Null}"
> >
<Button.ContextMenu> <Button.ContextMenu>
<ContextMenu x:Name="SettingMenus" Width="130"> <ContextMenu x:Name="SettingMenus" Width="130">
@@ -97,6 +111,7 @@
hc:IconElement.Width="18" hc:IconElement.Width="18"
HorizontalAlignment="Right" HorizontalAlignment="Right"
Click="CloseButtonClick" Click="CloseButtonClick"
FocusVisualStyle="{x:Null}"
/> />
</hc:UniformSpacingPanel> </hc:UniformSpacingPanel>
@@ -104,17 +119,22 @@
<uc:LeftCardControl Grid.Row="1" Grid.Column="0"/> <uc:LeftCardControl Grid.Row="1" Grid.Column="0"/>
<!--分割线--> <!--分割线-->
<GridSplitter Opacity="0" Grid.Row="1" Grid.Column="0" Width="1" VerticalAlignment="Stretch" HorizontalAlignment="Right"/> <GridSplitter Opacity="0" Grid.Row="1" Grid.Column="0" Width="1" VerticalAlignment="Stretch" HorizontalAlignment="Right"/>
<uc:RightCardControl Grid.Row="1" Grid.Column="1"/> <uc:RightCardControl Grid.Row="1" Grid.Column="1"/>
<hc:NotifyIcon Icon="/Taskbar.ico" Text="GeekDesk" Click="NotifyIcon_Click"> <hc:NotifyIcon Icon="/Taskbar.ico" Click="NotifyIcon_Click" x:Name="BarIcon"
Visibility="{Binding AppConfig.ShowBarIcon, Mode=TwoWay, Converter={StaticResource Boolean2VisibilityConverter}}">
<hc:NotifyIcon.ContextMenu> <hc:NotifyIcon.ContextMenu>
<ContextMenu Width="130"> <ContextMenu Width="130">
<MenuItem Header="打开面板" Click="ShowApp"/> <MenuItem Header="打开面板" Click="ShowApp"/>
<MenuItem Header="隐藏图标" Click="CloseBarIcon"/>
<MenuItem Header="待办" Click="BacklogMenuClick"/> <MenuItem Header="待办" Click="BacklogMenuClick"/>
<MenuItem Header="程序目录" Click="OpenThisDir"/>
<MenuItem Header="设置" Click="ConfigApp"/> <MenuItem Header="设置" Click="ConfigApp"/>
<MenuItem Header="重启" Click="ReStartApp"/>
<MenuItem Header="退出" Click="ExitApp"/> <MenuItem Header="退出" Click="ExitApp"/>
</ContextMenu> </ContextMenu>
</hc:NotifyIcon.ContextMenu> </hc:NotifyIcon.ContextMenu>
@@ -123,8 +143,7 @@
<StackPanel hc:Growl.GrowlParent="True" VerticalAlignment="Top" Margin="0,10,10,0"/> <StackPanel hc:Growl.GrowlParent="True" VerticalAlignment="Top" Margin="0,10,10,0"/>
</Grid> </Grid>
</Border> </Border>
</hc:DialogContainer>
</Border> </Border>
</Window> </Window>

View File

@@ -3,11 +3,14 @@ using GeekDesk.Constant;
using GeekDesk.Control; using GeekDesk.Control;
using GeekDesk.Control.UserControls.Config; using GeekDesk.Control.UserControls.Config;
using GeekDesk.Control.Windows; using GeekDesk.Control.Windows;
using GeekDesk.Interface;
using GeekDesk.Task; using GeekDesk.Task;
using GeekDesk.Thread; using GeekDesk.Thread;
using GeekDesk.Util; using GeekDesk.Util;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using Gma.System.MouseKeyHook;
using HandyControl.Data; using HandyControl.Data;
using System; using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Diagnostics; using System.Diagnostics;
@@ -18,6 +21,8 @@ using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Interop; using System.Windows.Interop;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Animation;
using static GeekDesk.Util.ShowWindowFollowMouse;
namespace GeekDesk namespace GeekDesk
{ {
@@ -25,11 +30,10 @@ namespace GeekDesk
/// MainWindow.xaml 的交互逻辑 /// MainWindow.xaml 的交互逻辑
/// </summary> /// </summary>
/// ///
public partial class MainWindow : Window public partial class MainWindow : Window, IWindowCommon
{ {
public static AppData appData = CommonCode.GetAppDataByFile(); public static AppData appData = CommonCode.GetAppDataByFile();
//public static ToDoInfoWindow toDoInfoWindow = (ToDoInfoWindow)ToDoInfoWindow.GetThis();
public static ToDoInfoWindow toDoInfoWindow; public static ToDoInfoWindow toDoInfoWindow;
public static int hotKeyId = -1; public static int hotKeyId = -1;
public static int toDoHotKeyId = -1; public static int toDoHotKeyId = -1;
@@ -43,8 +47,18 @@ namespace GeekDesk
this.Loaded += Window_Loaded; this.Loaded += Window_Loaded;
this.SizeChanged += MainWindow_Resize; this.SizeChanged += MainWindow_Resize;
ToDoTask.BackLogCheck(); ToDoTask.BackLogCheck();
////实例化隐藏 Hide类进行时间timer设置
MarginHide.ReadyHide(this);
if (appData.AppConfig.MarginHide)
{
MarginHide.StartHide();
}
} }
/// <summary>
/// 加载缓存数据
/// </summary>
private void LoadData() private void LoadData()
{ {
this.DataContext = appData; this.DataContext = appData;
@@ -55,27 +69,50 @@ namespace GeekDesk
this.Width = appData.AppConfig.WindowWidth; this.Width = appData.AppConfig.WindowWidth;
this.Height = appData.AppConfig.WindowHeight; this.Height = appData.AppConfig.WindowHeight;
} }
/// <summary>
/// 窗口加载完毕 执行方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Window_Loaded(object sender, RoutedEventArgs e) void Window_Loaded(object sender, RoutedEventArgs e)
{ {
if (!appData.AppConfig.StartedShowPanel) if (!appData.AppConfig.StartedShowPanel)
{
if (appData.AppConfig.AppAnimation)
{
this.Opacity = 0;
} else
{ {
this.Visibility = Visibility.Collapsed; this.Visibility = Visibility.Collapsed;
}
} else } else
{ {
ShowApp(); ShowApp();
} }
RegisterHotKey(true);
//RegisterCreateToDoHotKey(true);
if (!appData.AppConfig.SelfStartUped) //给任务栏图标一个名字
BarIcon.Text = Constants.MY_NAME;
//注册热键
RegisterHotKey(true);
RegisterCreateToDoHotKey(true);
//注册自启动
if (!appData.AppConfig.SelfStartUped && !Constants.DEV)
{ {
RegisterUtil.SetSelfStarting(appData.AppConfig.SelfStartUp, Constants.MY_NAME); RegisterUtil.SetSelfStarting(appData.AppConfig.SelfStartUp, Constants.MY_NAME);
} }
UpdateThread.Update();
//注册鼠标中键监听事件
if (appData.AppConfig.MouseMiddleShow)
{
MouseHookThread.MiddleHook();
}
//更新线程开启 检测更新
UpdateThread.Update();
} }
/// <summary> /// <summary>
@@ -87,18 +124,18 @@ namespace GeekDesk
{ {
if (appData.AppConfig.HotkeyModifiers != 0) if (appData.AppConfig.HotkeyModifiers != 0)
{ {
//加载完毕注册热键
hotKeyId = Hotkey.Regist(new WindowInteropHelper(MainWindow.mainWindow).Handle, appData.AppConfig.HotkeyModifiers, appData.AppConfig.Hotkey, () => hotKeyId = GlobalHotKey.RegisterHotKey(appData.AppConfig.HotkeyModifiers, appData.AppConfig.Hotkey, () =>
{ {
if (MotionControl.hotkeyFinished) if (MotionControl.hotkeyFinished)
{ {
if (mainWindow.Visibility == Visibility.Collapsed) if (mainWindow.Visibility == Visibility.Collapsed || mainWindow.Opacity == 0 || MarginHide.IS_HIDE)
{ {
ShowApp(); ShowApp();
} }
else else
{ {
mainWindow.Visibility = Visibility.Collapsed; HideApp();
} }
} }
}); });
@@ -122,6 +159,45 @@ namespace GeekDesk
} }
} }
/// <summary>
/// 淡入淡出效果
/// </summary>
/// <param name="opacity"></param>
/// <param name="milliseconds"></param>
/// <param name="visibility"></param>
public static void FadeStoryBoard(int opacity, int milliseconds, Visibility visibility)
{
if (appData.AppConfig.AppAnimation)
{
DoubleAnimation opacityAnimation = new DoubleAnimation
{
From = mainWindow.Opacity,
To = opacity,
Duration = new Duration(TimeSpan.FromMilliseconds(milliseconds))
};
opacityAnimation.Completed += (s, e) =>
{
mainWindow.BeginAnimation(OpacityProperty, null);
if (visibility == Visibility.Visible)
{
mainWindow.Opacity = 1;
} else
{
mainWindow.Opacity = 0;
}
};
Timeline.SetDesiredFrameRate(opacityAnimation, 60);
mainWindow.BeginAnimation(OpacityProperty, opacityAnimation);
} else
{
//防止关闭动画后 窗体仍是0透明度
mainWindow.Opacity = 1;
mainWindow.Visibility = visibility;
}
}
/// <summary> /// <summary>
/// 注册新建待办的热键 /// 注册新建待办的热键
/// </summary> /// </summary>
@@ -129,14 +205,15 @@ namespace GeekDesk
{ {
try try
{ {
if (appData.AppConfig.ToDoHotkeyModifiers!=0) if (appData.AppConfig.ToDoHotkeyModifiers!=0)
{ {
//加载完毕注册热键 //加载完毕注册热键
toDoHotKeyId = Hotkey.Regist(new WindowInteropHelper(MainWindow.mainWindow).Handle, appData.AppConfig.ToDoHotkeyModifiers, appData.AppConfig.ToDoHotkey, () => toDoHotKeyId = GlobalHotKey.RegisterHotKey(appData.AppConfig.ToDoHotkeyModifiers, appData.AppConfig.ToDoHotkey, () =>
{ {
if (MotionControl.hotkeyFinished) if (MotionControl.hotkeyFinished)
{ {
ToDoInfoWindow.ShowNone(); ToDoInfoWindow.ShowOrHide();
} }
}); });
} }
@@ -158,23 +235,12 @@ namespace GeekDesk
} }
} }
//private void DisplayWindowHotKeyPress(object sender, KeyPressedEventArgs e)
//{
// if (e.HotKey.Key == Key.Y)
// {
// if (this.Visibility == Visibility.Collapsed)
// {
// ShowApp();
// }
// else
// {
// this.Visibility = Visibility.Collapsed;
// }
// }
//}
/// <summary>
/// 重置窗体大小 写入缓存
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void MainWindow_Resize(object sender, System.EventArgs e) void MainWindow_Resize(object sender, System.EventArgs e)
{ {
if (this.DataContext != null) if (this.DataContext != null)
@@ -187,13 +253,13 @@ namespace GeekDesk
/// <summary>
/// 程序窗体拖动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DragMove(object sender, MouseEventArgs e) private void DragMove(object sender, MouseEventArgs e)
{ {
//if (e.LeftButton == MouseButtonState.Pressed)
//{
// this.DragMove();
//}
if (e.LeftButton == MouseButtonState.Pressed) if (e.LeftButton == MouseButtonState.Pressed)
{ {
@@ -210,7 +276,6 @@ namespace GeekDesk
(When clicking the drag area, make the window follow) */ (When clicking the drag area, make the window follow) */
DragMove(); DragMove();
if (this.ResizeMode != windowMode) if (this.ResizeMode != windowMode)
{ {
this.ResizeMode = windowMode; this.ResizeMode = windowMode;
@@ -229,9 +294,15 @@ namespace GeekDesk
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void CloseButtonClick(object sender, RoutedEventArgs e) private void CloseButtonClick(object sender, RoutedEventArgs e)
{
if (appData.AppConfig.AppAnimation)
{
FadeStoryBoard(0, (int)CommonEnum.WINDOW_ANIMATION_TIME, Visibility.Collapsed);
} else
{ {
this.Visibility = Visibility.Collapsed; this.Visibility = Visibility.Collapsed;
} }
}
@@ -258,64 +329,27 @@ namespace GeekDesk
} }
public static void ShowApp() public static void ShowApp()
{ {
//有全屏化应用则不显示
//if (CommonCode.IsPrimaryFullScreen())
//{
// return;
//}
//修改贴边隐藏状态为未隐藏
MarginHide.IS_HIDE = false;
if (appData.AppConfig.FollowMouse) if (appData.AppConfig.FollowMouse)
{ {
ShowAppAndFollowMouse(); ShowWindowFollowMouse.Show(mainWindow, MousePosition.CENTER, 0, 0, false);
} else
{
mainWindow.Visibility = Visibility.Visible;
} }
FadeStoryBoard(1, (int)CommonEnum.WINDOW_ANIMATION_TIME, Visibility.Visible);
Keyboard.Focus(mainWindow); Keyboard.Focus(mainWindow);
} }
/// <summary> public static void HideApp()
/// 随鼠标位置显示面板 (鼠标始终在中间)
/// </summary>
private static void ShowAppAndFollowMouse()
{ {
//获取鼠标位置 FadeStoryBoard(0, (int)CommonEnum.WINDOW_ANIMATION_TIME, Visibility.Collapsed);
System.Windows.Point p = MouseUtil.GetMousePosition();
double left = SystemParameters.VirtualScreenLeft;
double top = SystemParameters.VirtualScreenTop;
double width = SystemParameters.VirtualScreenWidth;
double height = SystemParameters.VirtualScreenHeight;
double right = width - Math.Abs(left);
double bottom = height - Math.Abs(top);
if (p.X - mainWindow.Width / 2 < left)
{
//判断是否在最左边缘
mainWindow.Left = left;
}
else if (p.X + mainWindow.Width / 2 > right)
{
//判断是否在最右边缘
mainWindow.Left = right - mainWindow.Width;
}
else
{
mainWindow.Left = p.X - mainWindow.Width / 2;
} }
if (p.Y - mainWindow.Height / 2 < top)
{
//判断是否在最上边缘
mainWindow.Top = top;
}
else if (p.Y + mainWindow.Height / 2 > bottom)
{
//判断是否在最下边缘
mainWindow.Top = bottom - mainWindow.Height;
}
else
{
mainWindow.Top = p.Y - mainWindow.Height / 2;
}
mainWindow.Visibility = Visibility.Visible;
}
/// <summary> /// <summary>
@@ -325,13 +359,13 @@ namespace GeekDesk
/// <param name="e"></param> /// <param name="e"></param>
private void NotifyIcon_Click(object sender, RoutedEventArgs e) private void NotifyIcon_Click(object sender, RoutedEventArgs e)
{ {
if (this.Visibility == Visibility.Collapsed) if (this.Visibility == Visibility.Collapsed || this.Opacity == 0)
{ {
ShowApp(); ShowApp();
} }
else else
{ {
this.Visibility = Visibility.Collapsed; HideApp();
} }
} }
@@ -345,28 +379,22 @@ namespace GeekDesk
ConfigWindow.Show(appData.AppConfig, this); ConfigWindow.Show(appData.AppConfig, this);
} }
/// <summary> /// <summary>
/// 右键任务栏图标退出 /// 右键任务栏图标打开程序目录
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="sender"></param>
/// <param name="e"></param> /// <param name="e"></param>
private void ExitApp(object sender, RoutedEventArgs e) private void OpenThisDir(object sender, RoutedEventArgs e)
{ {
Application.Current.Shutdown(); Process p = new Process();
p.StartInfo.FileName = "Explorer.exe";
p.StartInfo.Arguments = "/e,/select," + Constants.APP_DIR + Constants.MY_NAME + ".exe";
p.Start();
} }
//public static void ShowContextMenu(IntPtr hAppWnd, Window taskBar, System.Windows.Point pt)
//{
// WindowInteropHelper helper = new WindowInteropHelper(taskBar);
// IntPtr callingTaskBarWindow = helper.Handle;
// IntPtr wMenu = GetSystemMenu(hAppWnd, false);
// // Display the menu
// uint command = TrackPopupMenuEx(wMenu, TPM.LEFTBUTTON | TPM.RETURNCMD, (int) pt.X, (int) pt.Y, callingTaskBarWindow, IntPtr.Zero);
// if (command == 0) return;
// PostMessage(hAppWnd, WM.SYSCOMMAND, new IntPtr(command), IntPtr.Zero);
//}
/// <summary> /// <summary>
/// 设置图标 /// 设置图标
@@ -409,12 +437,16 @@ namespace GeekDesk
private void App_LostFocus(object sender, RoutedEventArgs e) private void App_LostFocus(object sender, RoutedEventArgs e)
{ {
if (appData.AppConfig.AppHideType == AppHideType.LOST_FOCUS) if (appData.AppConfig.AppHideType == AppHideType.LOST_FOCUS)
{
//如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
if (appData.AppConfig.MarginHide && !MarginHide.IS_HIDE)
{ {
this.Visibility = Visibility.Collapsed; this.Visibility = Visibility.Collapsed;
} }
} }
}
private void window_Deactivated(object sender, EventArgs e) private void Window_Deactivated(object sender, EventArgs e)
{ {
if (appData.AppConfig.AppHideType == AppHideType.LOST_FOCUS) if (appData.AppConfig.AppHideType == AppHideType.LOST_FOCUS)
{ {
@@ -422,7 +454,7 @@ namespace GeekDesk
} }
} }
private void window_SizeChanged(object sender, SizeChangedEventArgs e) private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{ {
if (this.DataContext != null) if (this.DataContext != null)
{ {
@@ -431,6 +463,60 @@ namespace GeekDesk
appData.AppConfig.WindowHeight = this.Height; appData.AppConfig.WindowHeight = this.Height;
} }
} }
/// <summary>
/// 右键任务栏图标退出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ExitApp(object sender, RoutedEventArgs e)
{
if (appData.AppConfig.MouseMiddleShow)
{
MouseHookThread.Dispose();
}
Application.Current.Shutdown();
}
/// <summary>
/// 重启
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ReStartApp(object sender, RoutedEventArgs e)
{
if (appData.AppConfig.MouseMiddleShow)
{
MouseHookThread.Dispose();
}
Process p = new Process();
p.StartInfo.FileName = Constants.APP_DIR + "GeekDesk.exe";
p.StartInfo.WorkingDirectory = Constants.APP_DIR;
p.Start();
Application.Current.Shutdown();
}
/// <summary>
/// 关闭托盘图标
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CloseBarIcon(object sender, RoutedEventArgs e)
{
appData.AppConfig.ShowBarIcon = false;
}
public void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
HideApp();
}
}
} }

View File

@@ -49,5 +49,5 @@ using System.Windows;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示: //通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.0")] [assembly: AssemblyVersion("2.4.1.0")]
[assembly: AssemblyFileVersion("2.0")] [assembly: AssemblyFileVersion("2.4.1.0")]

View File

@@ -1,6 +1,16 @@
# GeekDesk # GeekDesk 极客桌面
小巧、美观的桌面快速启动工具 小巧、**美观**的桌面快速启动管理工具
谈一谈做GeekDesk的原因:
目前的市场上也有一部分桌面图标管理工具, 但是**界面好点的收费**, **免费的界面差**
**windows11**都来了, 难道还要用界面停留在**win7时代**的软件吗
所以就萌生了做这款软件的想法, **免费 / 美观 / 高度定制化** 是从GeekDesk诞生开始就有的需求和方向, 未来也会向着这些方向发展
目前GeekDesk只有一个人在开发, 大家如果有好的建议也可以提Issue
另外如果你喜欢 GeekDesk的话, 或许可以为作者购买防脱洗发水
<img src="https://z3.ax1x.com/2021/07/20/WYdfmR.jpg" alt="WYdfmR.jpg" border="0" width="400px"/>
## 开发框架 ## 开发框架
- wpf - wpf
- .net 4.7.2 - .net 4.7.2
@@ -9,7 +19,6 @@
## 全局热键 鼠标跟随 快速启动 随时随地 ## 全局热键 鼠标跟随 快速启动 随时随地
- 支持自定义热键 - 支持自定义热键
- 支持鼠标跟随 - 支持鼠标跟随
-
<img src="https://z3.ax1x.com/2021/07/19/WJt4hQ.gif" alt="WJt4hQ.gif" border="0" width="800px"/> <img src="https://z3.ax1x.com/2021/07/19/WJt4hQ.gif" alt="WJt4hQ.gif" border="0" width="800px"/>
## 自定义壁纸 ## 自定义壁纸
@@ -21,13 +30,12 @@
- 背景图片毛玻璃效果 - 背景图片毛玻璃效果
- 界面透明度 - 界面透明度
- 界面圆角 - 界面圆角
-
<img src="https://z3.ax1x.com/2021/07/19/WGOYSU.gif" alt="WGOYSU.gif" border="0" width="800px"/> <img src="https://z3.ax1x.com/2021/07/19/WGOYSU.gif" alt="WGOYSU.gif" border="0" width="800px"/>
## 自定义菜单图标 ## 自定义菜单图标
- 80多个系统图标可供选择 - 80多个系统图标可供选择
- 另支持在线导入阿里巴巴icon图标 - 另支持在线导入阿里巴巴icon图标
- - 篇幅原因,公众号内回复 **自定义图标** 可以查看教程
<img src="https://z3.ax1x.com/2021/07/19/WJ3fDU.png" alt="WJ3fDU.png" border="0" width="450px"/> <img src="https://z3.ax1x.com/2021/07/19/WJ3fDU.png" alt="WJ3fDU.png" border="0" width="450px"/>
## 定时提醒 永不忘记 ## 定时提醒 永不忘记
@@ -36,15 +44,3 @@
## LICENSE ## LICENSE
- 这是个人开发的程序,任何人可任意修改和免费使用(未做较大功能性改动不允许修改赞赏码,重新修改发布需注明出处) - 这是个人开发的程序,任何人可任意修改和免费使用(未做较大功能性改动不允许修改赞赏码,重新修改发布需注明出处)
- 商用需联系作者 - 商用需联系作者
## 作者相关
主业Java程序员一枚(目前北京在职), 有好的工作请联系我 :smirk:
### 佛系公众号
不定期更新技术相关, 或者一些牢骚
<img src="https://z3.ax1x.com/2021/07/19/WJaI9e.jpg" alt="WJaI9e.jpg" border="0" />
### 佛系赞赏
我知道没人赞赏但我还是要放上来
<img src="https://z3.ax1x.com/2021/07/20/WYdfmR.jpg" alt="WYdfmR.jpg" border="0" width="500px"/>

View File

@@ -0,0 +1,60 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hc="https://handyorg.github.io/handycontrol">
<!--整体样式-->
<Style x:Key="BorderBG" TargetType="Border">
<Style.Setters>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush Opacity="0.97">
<GradientStop Color="#EBF7E3" Offset="0"/>
<GradientStop Color="#A8E4C0" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="BorderThickness" Value="0"/>
</Style.Setters>
</Style>
<LinearGradientBrush x:Key="BtnBG" Opacity="0.97">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
<!--按钮样式-->
<Style x:Key="Btn1" TargetType="Button" BasedOn="{StaticResource ButtonInfo}">
<Setter Property="Background" Value="{StaticResource BtnBG}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush">
<Setter.Value>
<SolidColorBrush Color="#E5E5E2"/>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="Black"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#E5E5E2"/>
</Trigger>
</Style.Triggers>
</Style>
<!--菜单样式-->
<Style x:Key="MyMenuStyle" TargetType="hc:SideMenuItem" BasedOn="{StaticResource SideMenuItemBaseStyle}">
<Style.Setters>
<Setter Property="Background" Value="Transparent"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Transparent"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -7,6 +7,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -24,9 +25,11 @@ namespace GeekDesk.Task
public static void BackLogCheck() public static void BackLogCheck()
{ {
System.Timers.Timer timer = new System.Timers.Timer(); System.Timers.Timer timer = new System.Timers.Timer
timer.Enabled = true; {
timer.Interval = 5000; Enabled = true,
Interval = 5000
};
timer.Start(); timer.Start();
timer.Elapsed += new System.Timers.ElapsedEventHandler(Check); timer.Elapsed += new System.Timers.ElapsedEventHandler(Check);
} }
@@ -48,9 +51,27 @@ namespace GeekDesk.Task
} }
} }
} }
ClearMemory();
})); }));
} }
/// <summary>
/// 释放内存
/// </summary>
public static void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#region
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
#endregion
} }

34
Thread/DispatcherBuild.cs Normal file
View File

@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Threading;
namespace GeekDesk.Thread
{
public class DispatcherBuild
{
//创建一个Dispatcher来单独使用ui线程
public static Dispatcher Build()
{
Dispatcher dispatcher = null;
var manualResetEvent = new ManualResetEvent(false);
var thread = new System.Threading.Thread(() =>
{
dispatcher = Dispatcher.CurrentDispatcher;
var synchronizationContext = new DispatcherSynchronizationContext(dispatcher);
SynchronizationContext.SetSynchronizationContext(synchronizationContext);
manualResetEvent.Set();
Dispatcher.Run();
});
thread.Start();
manualResetEvent.WaitOne();
manualResetEvent.Dispose();
return dispatcher;
}
}
}

79
Thread/MouseHookThread.cs Normal file
View File

@@ -0,0 +1,79 @@
using GeekDesk.Control.UserControls.Config;
using GeekDesk.Util;
using GeekDesk.ViewModel;
using Gma.System.MouseKeyHook;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
namespace GeekDesk.Thread
{
public class MouseHookThread
{
private static AppConfig appConfig = MainWindow.appData.AppConfig;
private static IKeyboardMouseEvents m_GlobalHook = null;
private static Dispatcher dispatcher;
public static void MiddleHook()
{
//使用dispatcher来单独监听UI线程 防止程序卡顿
if (dispatcher != null) return;
dispatcher = DispatcherBuild.Build();
m_GlobalHook = Hook.GlobalEvents();
dispatcher.Invoke((Action)(() =>
{
m_GlobalHook.MouseDownExt += M_GlobalHook_MouseDownExt;
}));
}
public static void Dispose()
{
try
{
m_GlobalHook.MouseDownExt -= M_GlobalHook_MouseDownExt;
m_GlobalHook.Dispose();
m_GlobalHook = null;
dispatcher.InvokeShutdown();
dispatcher = null;
}
catch { }
}
/// <summary>
/// 鼠标中键呼出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void M_GlobalHook_MouseDownExt(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (appConfig.MouseMiddleShow && e.Button == System.Windows.Forms.MouseButtons.Middle)
{
if (MotionControl.hotkeyFinished)
{
MainWindow.mainWindow.Dispatcher.Invoke((Action)(() =>
{
if (MainWindow.mainWindow.Visibility == Visibility.Collapsed
|| MainWindow.mainWindow.Opacity == 0
|| MarginHide.IS_HIDE)
{
MainWindow.ShowApp();
}
else
{
MainWindow.HideApp();
}
}));
}
}
}
}
}

View File

@@ -30,6 +30,10 @@ namespace GeekDesk.Thread
{ {
try try
{ {
//等待1分钟后再检查更新 有的网络连接过慢
System.Threading.Thread.Sleep(60 * 1000);
string updateUrl; string updateUrl;
string nowVersion = ConfigurationManager.AppSettings["Version"]; string nowVersion = ConfigurationManager.AppSettings["Version"];
switch (appConfig.UpdateType) switch (appConfig.UpdateType)
@@ -57,8 +61,7 @@ namespace GeekDesk.Thread
} }
} catch (Exception e) } catch (Exception e)
{ {
//不做处理 LogUtil.WriteErrorLog(e, "检测更新失败!");
//MessageBox.Show(e.Message);
} }
} }
} }

View File

@@ -1,9 +1,9 @@
{ {
"title" : "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "title": "GeekDesk版本更新",
"subTitle" : "V2.0 <20><>ʽ<EFBFBD><CABD>", "subTitle": "V2.4.10",
"msgTitle" : "<EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "msgTitle": "本次更新内容如下",
"msg" : "['<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><EFBFBD>ٵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>','<27>޸<EFBFBD><DEB8><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>񱣴<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bug','<27>޸<EFBFBD>ijЩͼ<D0A9><CDBC><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>С<EFBFBD><D0A1>bug','<27><><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>óɹ<C3B3><C9B9><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>','<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ','<27><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>ϵͳ<CFB5>˵<EFBFBD>']", "msg": "['各位兄弟去给我点个免费Star呗','增加添加系统和开始菜单应用功能','增加项目启动参数','优化贴边隐藏动画效果(可能现在并不完美)','增加双击打开功能','其它已知问题修复(如果有人发现)']",
"githubUrl" : "https://github.com/Demo-Liu/GeekDesk/releases/tag/2.0", "githubUrl": "https://github.com/Demo-Liu/GeekDesk/releases",
"giteeUrl" : "https://gitee.com/demo_liu/GeekDesk/releases/2.0", "giteeUrl": "https://gitee.com/demo_liu/GeekDesk/releases",
"version": "2.0" "version": "2.4.10"
} }

9
Update.json.bak Normal file
View File

@@ -0,0 +1,9 @@
{
"title": "GeekDesk<73><EFBFBD><E6B1BE><EFBFBD><EFBFBD>",
"subTitle": "V2.3.21",
"msgTitle": "<22><><EFBFBD>θ<EFBFBD><CEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"msg": "['<27><><EFBFBD>д<EFBFBD><D0B4>ڿ<EFBFBD>Esc<73>˳<EFBFBD>','<27>޸<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUG,<2C><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>D<EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ','<27>޸<EFBFBD><DEB8><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>']",
"githubUrl": "https://github.com/Demo-Liu/GeekDesk/releases",
"giteeUrl": "https://gitee.com/demo_liu/GeekDesk/releases",
"version": "2.3.21"
}

View File

@@ -1,7 +1,11 @@
using GeekDesk.Constant; using GeekDesk.Constant;
using GeekDesk.ViewModel; using GeekDesk.ViewModel;
using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Binary;
using System.Windows;
using System.Windows.Media.Imaging;
/// <summary> /// <summary>
/// 提取一些代码 /// 提取一些代码
@@ -42,7 +46,6 @@ namespace GeekDesk.Util
/// <param name="appData"></param> /// <param name="appData"></param>
public static void SaveAppData(AppData appData) public static void SaveAppData(AppData appData)
{ {
using (FileStream fs = new FileStream(Constants.DATA_FILE_PATH, FileMode.Create)) using (FileStream fs = new FileStream(Constants.DATA_FILE_PATH, FileMode.Create))
{ {
BinaryFormatter bf = new BinaryFormatter(); BinaryFormatter bf = new BinaryFormatter();
@@ -52,6 +55,138 @@ namespace GeekDesk.Util
/// <summary>
/// 判断当前屏幕(鼠标最后活动屏幕)是否有全屏化应用
/// </summary>
/// <returns></returns>
public static bool IsPrimaryFullScreen()
{
RECT rect = new RECT();
GetWindowRect(new HandleRef(null, GetForegroundWindow()), ref rect);
int windowHeight = rect.bottom - rect.top;
int screenHeight = (int)SystemParameters.PrimaryScreenHeight;
if (windowHeight >= screenHeight)
{
return true;
}
return false;
}
/// <summary>
/// 根据路径获取文件图标等信息
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static IconInfo GetIconInfoByPath(string path)
{
string tempPath = path;
//string base64 = ImageUtil.FileImageToBase64(path, System.Drawing.Imaging.ImageFormat.Png);
//string ext = "";
//if (!ImageUtil.IsSystemItem(path))
//{
// ext = System.IO.Path.GetExtension(path).ToLower();
//}
string iconPath = null;
//if (".lnk".Equals(ext))
//{
string targetPath = FileUtil.GetTargetPathByLnk(path);
iconPath = FileUtil.GetIconPathByLnk(path);
if (targetPath != null)
{
path = targetPath;
}
//}
if (StringUtil.IsEmpty(iconPath))
{
iconPath = path;
}
BitmapImage bi = ImageUtil.GetBitmapIconByPath(iconPath);
IconInfo iconInfo = new IconInfo
{
Path = path,
LnkPath = tempPath,
BitmapImage = bi,
StartArg = FileUtil.GetArgByLnk(tempPath)
};
iconInfo.DefaultImage = iconInfo.ImageByteArr;
iconInfo.Name = System.IO.Path.GetFileNameWithoutExtension(tempPath);
if (StringUtil.IsEmpty(iconInfo.Name))
{
iconInfo.Name = path;
}
return iconInfo;
}
public static IconInfo GetIconInfoByPath_NoWrite(string path)
{
string tempPath = path;
//string base64 = ImageUtil.FileImageToBase64(path, System.Drawing.Imaging.ImageFormat.Png);
string ext = "";
if (!ImageUtil.IsSystemItem(path))
{
ext = System.IO.Path.GetExtension(path).ToLower();
}
string iconPath = null;
if (".lnk".Equals(ext))
{
string targetPath = FileUtil.GetTargetPathByLnk(path);
iconPath = FileUtil.GetIconPathByLnk(path);
if (targetPath != null)
{
path = targetPath;
}
}
if (StringUtil.IsEmpty(iconPath))
{
iconPath = path;
}
BitmapImage bi = ImageUtil.GetBitmapIconByPath(iconPath);
IconInfo iconInfo = new IconInfo
{
Path_NoWrite = path,
LnkPath_NoWrite = tempPath,
BitmapImage_NoWrite = bi,
StartArg_NoWrite = FileUtil.GetArgByLnk(tempPath)
};
iconInfo.DefaultImage_NoWrite = iconInfo.ImageByteArr;
iconInfo.Name = System.IO.Path.GetFileNameWithoutExtension(tempPath);
if (StringUtil.IsEmpty(iconInfo.Name))
{
iconInfo.Name_NoWrite = path;
}
return iconInfo;
}
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32.dll")]
private static extern bool GetWindowRect(HandleRef hWnd, [In, Out] ref RECT rect);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
} }

View File

@@ -2,6 +2,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
@@ -35,7 +36,7 @@ namespace GeekDesk.Util
public static BitmapImage GetBitmapImage(string filePath) public static BitmapImage GetBitmapImage(string filePath)
{ {
Icon ico; Icon ico = null;
//选中文件中的图标总数 //选中文件中的图标总数
var iconTotalCount = PrivateExtractIcons(filePath, 0, 0, 0, null, null, 0, 0); var iconTotalCount = PrivateExtractIcons(filePath, 0, 0, 0, null, null, 0, 0);
//用于接收获取到的图标指针 //用于接收获取到的图标指针
@@ -52,33 +53,98 @@ namespace GeekDesk.Util
{ {
ip = hIcons[0]; ip = hIcons[0];
ico = Icon.FromHandle(ip); ico = Icon.FromHandle(ip);
if (IsMinOrTransparent(ico))
{
ico = null;
} }
else if (GetBlurExts().Contains(ext)) }
if (ico == null && GetBlurExts().Contains(ext))
{ {
ico = Icon.ExtractAssociatedIcon(filePath); ico = Icon.ExtractAssociatedIcon(filePath);
if (IsMinOrTransparent(ico))
{
ico = null;
} }
else }
if (ico == null)
{ {
ip = GetJumboIcon(GetIconIndex(filePath)); ip = GetJumboIcon(GetIconIndex(filePath));
ico = Icon.FromHandle(ip); ico = Icon.FromHandle(ip);
} }
Bitmap bmp = ico.ToBitmap(); return IconToBitmapImage(ico, ip);
}
private static BitmapImage IconToBitmapImage(Icon icon, IntPtr iconIP)
{
Bitmap bmp = icon.ToBitmap();
MemoryStream strm = new MemoryStream(); MemoryStream strm = new MemoryStream();
bmp.Save(strm, System.Drawing.Imaging.ImageFormat.Png);
ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/png");
Encoder myEncoder = Encoder.Quality;
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 75L);
EncoderParameters myEncoderParameters = new EncoderParameters(1);
myEncoderParameters.Param[0] = myEncoderParameter;
//bmp.Save("d:\\test.png");
bmp.Save(strm, myImageCodecInfo, myEncoderParameters);
BitmapImage bmpImage = new BitmapImage(); BitmapImage bmpImage = new BitmapImage();
bmpImage.BeginInit(); bmpImage.BeginInit();
strm.Seek(0, SeekOrigin.Begin); strm.Seek(0, SeekOrigin.Begin);
bmpImage.StreamSource = strm; bmpImage.StreamSource = strm;
bmpImage.EndInit(); bmpImage.EndInit();
if (ip != IntPtr.Zero) if (iconIP != IntPtr.Zero)
{ {
Shell32.DestroyIcon(ip); Shell32.DestroyIcon(iconIP);
} }
return bmpImage.Clone(); return bmpImage.Clone();
} }
private static bool IsMinOrTransparent(Icon ico)
{
Bitmap bm = ico.ToBitmap();
double w = bm.Width;
double h = bm.Height;
Color middleColor = bm.GetPixel((int)(w * 0.50), (int)(h * 0.50));
Color transparent = Color.FromArgb(0, 0, 0, 0);
//如果中间像素不为空 直接判断此icon不为空
if (middleColor != Color.Transparent && middleColor != transparent)
{
return false;
}
//判断中间一条横线像素 有不透明元素即判断 icon不为空
Color c;
int h2 = (int)h / 2;
for (int i=0; i<(int)w; i++)
{
c = bm.GetPixel(i, h2);
if (c!= Color.Transparent && c != transparent)
{
return false;
}
}
return true;
}
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
public static int GetIconIndex(string pszFile) public static int GetIconIndex(string pszFile)
{ {
@@ -395,7 +461,6 @@ namespace GeekDesk.Util
int iOverlay, int iOverlay,
ref int piIndex); ref int piIndex);
}; };
} }
} }

View File

@@ -2,7 +2,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace GeekDesk.Util namespace GeekDesk.Util
@@ -10,23 +12,151 @@ namespace GeekDesk.Util
public class FileUtil public class FileUtil
{ {
private static readonly string NO_PATH = "{(.*)}";
private static readonly string NO_ICO = "^,(.*)";
private static readonly string HAVE_ICO = "(.*),(.*)";
public static string GetTargetPathByLnk(string filePath) public static string GetTargetPathByLnk(string filePath)
{ {
try try
{ {
WshShell shell = new WshShell(); WshShell shell = new WshShell();
IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(filePath); IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(filePath);
if (StringUtil.IsEmpty(shortcut.TargetPath)) if (StringUtil.IsEmpty(shortcut.TargetPath))
{ {
return null; return null;
} }
return shortcut.TargetPath; string path = shortcut.TargetPath;
if (path==null || Regex.IsMatch(path, NO_PATH))
{
path = ParseShortcut(filePath);
}
return path;
} }
catch (Exception e) catch (Exception e)
{
LogUtil.WriteErrorLog(e, "获取目标路径失败! filePath=" + filePath);
return null;
}
}
/// <summary>
/// 获取启动参数
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetArgByLnk(string filePath)
{
try
{
WshShell shell = new WshShell();
IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(filePath);
return shortcut.Arguments;
}
catch (Exception e)
{
LogUtil.WriteErrorLog(e, "获取启动参数失败! filePath=" + filePath);
return "";
}
}
/// <summary>
/// 获取iconpath
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetIconPathByLnk(string filePath)
{
try
{
WshShell shell = new WshShell();
IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(filePath);
var iconPath = shortcut.IconLocation;
if (StringUtil.IsEmpty(iconPath)
|| Regex.IsMatch(iconPath, NO_ICO)
|| Regex.IsMatch(iconPath, NO_PATH)
|| !Regex.IsMatch(iconPath, HAVE_ICO))
{
return null;
} else
{
return iconPath.Split(',')[0];
}
}
catch (Exception e)
{
LogUtil.WriteErrorLog(e, "获取图标路径失败! filePath=" + filePath);
return null;
}
}
/*
UINT MsiGetShortcutTarget(
LPCTSTR szShortcutTarget,
LPTSTR szProductCode,
LPTSTR szFeatureId,
LPTSTR szComponentCode
);
*/
[DllImport("msi.dll", CharSet = CharSet.Auto)]
static extern int MsiGetShortcutTarget(string targetFile, StringBuilder productCode, StringBuilder featureID, StringBuilder componentCode);
public enum InstallState
{
NotUsed = -7,
BadConfig = -6,
Incomplete = -5,
SourceAbsent = -4,
MoreData = -3,
InvalidArg = -2,
Unknown = -1,
Broken = 0,
Advertised = 1,
Removed = 1,
Absent = 2,
Local = 3,
Source = 4,
Default = 5
}
public const int MaxFeatureLength = 38;
public const int MaxGuidLength = 38;
public const int MaxPathLength = 1024;
/*
INSTALLSTATE MsiGetComponentPath(
LPCTSTR szProduct,
LPCTSTR szComponent,
LPTSTR lpPathBuf,
DWORD* pcchBuf
);
*/
[DllImport("msi.dll", CharSet = CharSet.Auto)]
static extern InstallState MsiGetComponentPath(string productCode, string componentCode, StringBuilder componentPath, ref int componentPathBufferSize);
public static string ParseShortcut(string file)
{
StringBuilder product = new StringBuilder(MaxGuidLength + 1);
StringBuilder feature = new StringBuilder(MaxFeatureLength + 1);
StringBuilder component = new StringBuilder(MaxGuidLength + 1);
MsiGetShortcutTarget(file, product, feature, component);
int pathLength = MaxPathLength;
StringBuilder path = new StringBuilder(pathLength);
InstallState installState = MsiGetComponentPath(product.ToString(), component.ToString(), path, ref pathLength);
if (installState == InstallState.Local)
{
return path.ToString();
}
else
{ {
return null; return null;
} }
} }
} }
} }

98
Util/GlobalHotKey.cs Normal file
View File

@@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Windows.Input;
namespace GeekDesk.Util
{
public class GlobalHotKey
{
public enum HotkeyModifiers
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
private static int currentID;
private static readonly Dictionary<int, InvisibleWindowForMessages> handleTemp = new Dictionary<int, InvisibleWindowForMessages>();
public delegate void HotKeyCallBackHanlder();
/// <summary>
/// Registers a global hotkey
/// </summary>
/// <param name="aKeyGestureString">e.g. Alt + Shift + Control + Win + S</param>
/// <param name="callback">Action to be called when hotkey is pressed</param>
/// <returns>true, if registration succeeded, otherwise false</returns>
public static int RegisterHotKey(string aKeyGestureString, HotKeyCallBackHanlder callback)
{
var c = new KeyGestureConverter();
KeyGesture aKeyGesture = (KeyGesture)c.ConvertFrom(aKeyGestureString);
return RegisterHotKey((HotkeyModifiers)aKeyGesture.Modifiers, aKeyGesture.Key, callback);
}
public static int RegisterHotKey(HotkeyModifiers aModifier, Key key, HotKeyCallBackHanlder callback)
{
InvisibleWindowForMessages window = new InvisibleWindowForMessages(callback);
currentID += 1;
if (!RegisterHotKey(window.Handle, currentID, aModifier, (uint)KeyInterop.VirtualKeyFromKey(key)))
{
window.Dispose();
throw new Exception("RegisterHotKey Failed");
}
handleTemp.Add(currentID, window);
return currentID;
}
public static void Dispose(int id)
{
try
{
UnregisterHotKey(handleTemp[id].Handle, id);
GlobalHotKey.handleTemp[id].Dispose();
GlobalHotKey.handleTemp.Remove(id);
} catch (Exception e)
{
//nothing
LogUtil.WriteErrorLog(e, "取消注册热键异常!");
}
}
// Registers a hot key with Windows.
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, uint vk);
// Unregisters the hot key with Windows.
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
private class InvisibleWindowForMessages : NativeWindow, IDisposable
{
public event HotKeyCallBackHanlder callback;
public InvisibleWindowForMessages(HotKeyCallBackHanlder callback)
{
CreateHandle(new CreateParams());
this.callback += callback;
}
private static readonly int WM_HOTKEY = 0x0312;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_HOTKEY)
{
callback();
}
}
public void Dispose()
{
this.DestroyHandle();
}
}
}
}

View File

@@ -1,96 +0,0 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
/// <summary>
/// 热键注册
/// </summary>
namespace GeekDesk.Util
{
class Hotkey
{
#region api
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, uint vk);
[DllImport("user32.dll")]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
#endregion
/// <summary>
/// 注册快捷键
/// </summary>
/// <param name="window">持有快捷键窗口</param>
/// <param name="fsModifiers">组合键</param>
/// <param name="key">快捷键</param>
/// <param name="callBack">回调函数</param>
public static int Regist(IntPtr windowHandle, HotkeyModifiers fsModifiers, Key key, HotKeyCallBackHanlder callBack)
{
HwndSource hs = HwndSource.FromHwnd(windowHandle);
hs.AddHook(WndProc);
int id = keyid++;
int vk = KeyInterop.VirtualKeyFromKey(key);
keymap.Add(id, callBack);
if (!RegisterHotKey(windowHandle, id, fsModifiers, (uint)vk)) throw new Exception("RegisterHotKey Failed");
return id;
}
/// <summary>
/// 快捷键消息处理
/// </summary>
static IntPtr WndProc(IntPtr windowHandle, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_HOTKEY)
{
int id = wParam.ToInt32();
if (keymap.TryGetValue(id, out var callback))
{
callback();
}
}
return IntPtr.Zero;
}
/// <summary>
/// 注销快捷键
/// </summary>
/// <param name="hWnd">持有快捷键窗口的句柄</param>
/// <param name="callBack">回调函数</param>
public static void UnRegist(IntPtr windowHandle, HotKeyCallBackHanlder callBack)
{
List<int> list = new List<int>(keymap.Keys);
for (int i=0; i < list.Count; i++)
{
if (keymap[list[i]] == callBack)
{
HwndSource hs = HwndSource.FromHwnd(windowHandle);
hs.RemoveHook(WndProc);
UnregisterHotKey(windowHandle, list[i]);
keymap.Remove(list[i]);
}
}
}
const int WM_HOTKEY = 0x312;
static int keyid = 10;
public static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();
public delegate void HotKeyCallBackHanlder();
}
public enum HotkeyModifiers
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
}

View File

@@ -17,10 +17,12 @@ namespace GeekDesk.Util
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
//创建Web访问对 象 //创建Web访问对 象
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url); HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.ContentType = "text/plain; charset=utf-8";
//通过Web访问对象获取响应内容 //通过Web访问对象获取响应内容
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse(); HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
//通过响应内容流创建StreamReader对象因为StreamReader更高级更快 //通过响应内容流创建StreamReader对象因为StreamReader更高级更快
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.GetEncoding("gbk")); StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.GetEncoding("utf-8"));
string returnStr = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾 string returnStr = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
reader.Close(); reader.Close();
myResponse.Close(); myResponse.Close();

View File

@@ -4,14 +4,17 @@ using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Text.RegularExpressions;
using System.Windows; using System.Windows;
using System.Windows.Interop; using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
namespace GeekDesk.Util namespace GeekDesk.Util
{ {
class ImageUtil class ImageUtil
{ {
private static readonly string SYSTEM_ITEM = "::{.*}";
/// <summary> /// <summary>
/// 图片数组转 BitmapImage /// 图片数组转 BitmapImage
@@ -22,9 +25,10 @@ namespace GeekDesk.Util
{ {
using (var ms = new System.IO.MemoryStream(array)) using (var ms = new System.IO.MemoryStream(array))
{ {
var image = new BitmapImage(); BitmapImage image = new BitmapImage();
image.BeginInit(); image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad; // here image.CacheOption = BitmapCacheOption.OnLoad; // here
RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality);
image.StreamSource = ms; image.StreamSource = ms;
image.EndInit(); image.EndInit();
return image; return image;
@@ -82,7 +86,12 @@ namespace GeekDesk.Util
/// <returns></returns> /// <returns></returns>
public static BitmapImage GetBitmapIconByPath(string filePath) public static BitmapImage GetBitmapIconByPath(string filePath)
{ {
if (File.Exists(filePath)) if (filePath.Contains("%windir%"))
{
filePath = filePath.Replace("%windir%", System.Environment.GetEnvironmentVariable("windir"));
}
if (File.Exists(filePath) || IsSystemItem(filePath))
{ {
if (IsImage(filePath)) { if (IsImage(filePath)) {
//图片 //图片
@@ -92,9 +101,18 @@ namespace GeekDesk.Util
return FileIcon.GetBitmapImage(filePath); return FileIcon.GetBitmapImage(filePath);
} }
} else if(Directory.Exists(filePath)) { } else if(Directory.Exists(filePath)) {
if ((filePath.IndexOf("\\") == filePath.LastIndexOf("\\")) && filePath.IndexOf("\\") == filePath.Length - 1)
{
//磁盘
return ImageUtil.Base64ToBitmapImage(Constants.DEFAULT_DISK_IMAGE_BASE64);
} else
{
//文件夹 //文件夹
return ImageUtil.Base64ToBitmapImage(Constants.DEFAULT_DIR_IMAGE_BASE64); return ImageUtil.Base64ToBitmapImage(Constants.DEFAULT_DIR_IMAGE_BASE64);
} }
}
return null; return null;
} }
@@ -184,7 +202,7 @@ namespace GeekDesk.Util
Bitmap bmpOut = new Bitmap(lnNewWidth, lnNewHeight); Bitmap bmpOut = new Bitmap(lnNewWidth, lnNewHeight);
Graphics g = Graphics.FromImage(bmpOut); Graphics g = Graphics.FromImage(bmpOut);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.FillRectangle(Brushes.White, 0, 0, lnNewWidth, lnNewHeight); g.FillRectangle(System.Drawing.Brushes.White, 0, 0, lnNewWidth, lnNewHeight);
g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight); g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight);
loBMP.Dispose(); loBMP.Dispose();
string tempPath = Constants.APP_DIR + "\\temp"; string tempPath = Constants.APP_DIR + "\\temp";
@@ -198,8 +216,9 @@ namespace GeekDesk.Util
return bm; return bm;
} }
} }
catch (Exception) catch (Exception e)
{ {
LogUtil.WriteErrorLog(e, "获取文件缩略图失败!filePath="+filePath);
return Base64ToBitmapImage(Constants.DEFAULT_IMG_IMAGE_BASE64); return Base64ToBitmapImage(Constants.DEFAULT_IMG_IMAGE_BASE64);
} }
@@ -211,6 +230,7 @@ namespace GeekDesk.Util
BitmapImage bmImg = new BitmapImage(); BitmapImage bmImg = new BitmapImage();
bmImg.BeginInit(); bmImg.BeginInit();
bmImg.CacheOption = BitmapCacheOption.OnLoad; bmImg.CacheOption = BitmapCacheOption.OnLoad;
RenderOptions.SetBitmapScalingMode(bmImg, BitmapScalingMode.LowQuality);
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{ {
bmImg.StreamSource = fs; bmImg.StreamSource = fs;
@@ -297,8 +317,9 @@ namespace GeekDesk.Util
ms.Close(); ms.Close();
return Convert.ToBase64String(arr); return Convert.ToBase64String(arr);
} }
catch (Exception) catch (Exception e)
{ {
LogUtil.WriteErrorLog(e, "图片文件转base64失败!Imagefilename=" + Imagefilename + ",ImageFormat="+format);
return null; return null;
} }
} }
@@ -331,5 +352,15 @@ namespace GeekDesk.Util
} }
/// <summary>
/// 判断是否为系统项
/// </summary>
/// <returns></returns>
public static bool IsSystemItem(string path)
{
return Regex.IsMatch(path, SYSTEM_ITEM);
}
} }
} }

76
Util/LogUtil.cs Normal file
View File

@@ -0,0 +1,76 @@
using GeekDesk.Constant;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GeekDesk.Util
{
public class LogUtil
{
public static void WriteErrorLog(object exception, string msg = "")
{
try
{
Exception ex = exception as Exception;
using (FileStream fs = File.Open(Constants.ERROR_FILE_PATH, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
fs.Seek(0, SeekOrigin.End);
byte[] buffer = Encoding.Default.GetBytes("-------------------------------------------------------\r\n");
fs.Write(buffer, 0, buffer.Length);
buffer = Encoding.Default.GetBytes(DateTime.Now.ToString() + msg + "\r\n");
fs.Write(buffer, 0, buffer.Length);
if (ex != null)
{
buffer = Encoding.Default.GetBytes("成员名: " + ex.TargetSite + "\r\n");
fs.Write(buffer, 0, buffer.Length);
buffer = Encoding.Default.GetBytes("引发异常的类: " + ex.TargetSite.DeclaringType + "\r\n");
fs.Write(buffer, 0, buffer.Length);
buffer = Encoding.Default.GetBytes("异常信息: " + ex.Message + "\r\n");
fs.Write(buffer, 0, buffer.Length);
buffer = Encoding.Default.GetBytes("引发异常的程序集或对象: " + ex.Source + "\r\n");
fs.Write(buffer, 0, buffer.Length);
buffer = Encoding.Default.GetBytes("栈:" + ex.StackTrace + "\r\n");
fs.Write(buffer, 0, buffer.Length);
}
else
{
buffer = Encoding.Default.GetBytes("应用程序错误: " + exception.ToString() + "\r\n");
fs.Write(buffer, 0, buffer.Length);
}
}
} catch
{
}
}
public static void WriteLog(string msg)
{
try {
using (FileStream fs = File.Open(Constants.LOG_FILE_PATH, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
fs.Seek(0, SeekOrigin.End);
byte[] buffer = Encoding.Default.GetBytes("-------------------------------------------------------\r\n");
fs.Write(buffer, 0, buffer.Length);
buffer = Encoding.Default.GetBytes(DateTime.Now.ToString() + msg + "\r\n" );
fs.Write(buffer, 0, buffer.Length);
}
} catch { }
}
}
}

286
Util/MarginHide.cs Normal file
View File

@@ -0,0 +1,286 @@
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 HideType
{
TOP_SHOW = 1,
LEFT_SHOW = 2,
RIGHT_SHOW = 3,
TOP_HIDE = 4,
LEFT_HIDE = 5,
RIGHT_HIDE = 6
}
public class MarginHide
{
private static Window window;//定义使用该方法的窗体
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 static double showMarginWidth = 1;
public static bool IS_RUN = false;
public static bool IS_HIDE = false;
private static Timer timer = null;
public static void ReadyHide(Window window)
{
MarginHide.window = window;
if (timer != null) return;
timer = new Timer();//添加timer计时器隐藏功能
timer.Interval = taskTime;
timer.Tick += HideWindow;
timer.Start();
}
/// <summary>
/// 窗体是否贴边
/// </summary>
/// <returns></returns>
public static 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 static void HideWindow(object o, EventArgs e)
{
if (window.Visibility != Visibility.Visible || !IS_RUN) 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) && !IS_HIDE)
{
//上方隐藏条件
if (windowTop <= screenTop)
{
IS_HIDE = true;
FadeAnimation(1, 0);
HideAnimation(windowTop, screenTop - windowHeight + showMarginWidth, Window.TopProperty, HideType.TOP_HIDE);
return;
}
//左侧隐藏条件
if (windowLeft <= screenLeft)
{
IS_HIDE = true;
FadeAnimation(1, 0);
HideAnimation(windowLeft, screenLeft - windowWidth + showMarginWidth, Window.LeftProperty, HideType.LEFT_HIDE);
return;
}
//右侧隐藏条件
if (windowLeft + windowWidth + Math.Abs(screenLeft) >= screenWidth)
{
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 && IS_HIDE)
{
//上方显示
if (windowTop <= screenTop - showMarginWidth)
{
IS_HIDE = false;
HideAnimation(windowTop, screenTop, Window.TopProperty, HideType.TOP_SHOW);
FadeAnimation(0, 1);
return;
}
//左侧显示
if (windowLeft <= screenLeft - showMarginWidth)
{
IS_HIDE = false;
HideAnimation(windowLeft, screenLeft, Window.LeftProperty, HideType.LEFT_SHOW);
FadeAnimation(0, 1);
return;
}
//右侧显示
if (windowLeft + Math.Abs(screenLeft) == screenWidth - showMarginWidth)
{
IS_HIDE = false;
HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty, HideType.RIGHT_SHOW);
FadeAnimation(0, 1);
return;
}
}
}
#endregion
public static void StartHide()
{
IS_RUN = true;
}
public static void StopHide()
{
IS_RUN = false;
//功能关闭 如果界面是隐藏状态 那么要显示界面 ↓
if (IS_HIDE)
{
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)
{
IS_HIDE = false;
FadeAnimation(0, 1);
HideAnimation(windowLeft, screenLeft, Window.LeftProperty, HideType.LEFT_SHOW);
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)
{
IS_HIDE = false;
FadeAnimation(0, 1);
HideAnimation(windowLeft, screenWidth - Math.Abs(screenLeft) - windowWidth, Window.LeftProperty, HideType.RIGHT_SHOW);
return;
}
}
}
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,
To = to,
Duration = new Duration(TimeSpan.FromMilliseconds(hideTime))
};
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);
}
}
}

View File

@@ -48,8 +48,11 @@ namespace GeekDesk.Util
key.Close(); key.Close();
} }
#pragma warning disable CS0168 // 声明了变量“ex”但从未使用过
catch (Exception ex) catch (Exception ex)
#pragma warning restore CS0168 // 声明了变量“ex”但从未使用过
{ {
LogUtil.WriteErrorLog(ex, "注册启动Error1!");
return false; return false;
} }
} }
@@ -60,19 +63,25 @@ namespace GeekDesk.Util
key.DeleteValue(exeName);//取消开机启动 key.DeleteValue(exeName);//取消开机启动
key.Close(); key.Close();
} }
#pragma warning disable CS0168 // 声明了变量“ex”但从未使用过
catch (Exception ex) catch (Exception ex)
#pragma warning restore CS0168 // 声明了变量“ex”但从未使用过
{ {
LogUtil.WriteErrorLog(ex, "注册启动Error2!");
return false; return false;
} }
} }
return true; return true;
} }
#pragma warning disable CS0168 // 声明了变量“ex”但从未使用过
catch (Exception ex) catch (Exception ex)
#pragma warning restore CS0168 // 声明了变量“ex”但从未使用过
{ {
if (key != null) if (key != null)
{ {
key.Close(); key.Close();
} }
LogUtil.WriteErrorLog(ex, "注册启动Error3!");
return false; return false;
} }
} }

View File

@@ -1509,7 +1509,9 @@ namespace GeekDesk.Util
m_hookType, m_hookType,
m_filterFunc, m_filterFunc,
IntPtr.Zero, IntPtr.Zero,
#pragma warning disable CS0618 // <20><>AppDomain.GetCurrentThreadId()<29><><EFBFBD>ѹ<EFBFBD>ʱ:<3A><>AppDomain.GetCurrentThreadId has been deprecated because it does not provide a stable Id when managed threads are running on fibers (aka lightweight threads). To get a stable identifier for a managed thread, use the ManagedThreadId property on Thread. http://go.microsoft.com/fwlink/?linkid=14202<30><32>
(int)AppDomain.GetCurrentThreadId()); (int)AppDomain.GetCurrentThreadId());
#pragma warning restore CS0618 // <20><>AppDomain.GetCurrentThreadId()<29><><EFBFBD>ѹ<EFBFBD>ʱ:<3A><>AppDomain.GetCurrentThreadId has been deprecated because it does not provide a stable Id when managed threads are running on fibers (aka lightweight threads). To get a stable identifier for a managed thread, use the ManagedThreadId property on Thread. http://go.microsoft.com/fwlink/?linkid=14202<30><32>
} }
// ************************************************************************ // ************************************************************************

View File

@@ -0,0 +1,110 @@
using System;
using System.Windows;
namespace GeekDesk.Util
{
public class ShowWindowFollowMouse
{
public enum MousePosition
{
CENTER = 1,
LEFT_TOP = 2,
LEFT_BOTTOM = 3,
RIGHT_TOP = 4,
RIGHT_BOTTOM = 5,
LEFT_CENTER = 6,
RIGHT_CENTER = 7
}
/// <summary>
/// 随鼠标位置显示面板
/// </summary>
public static void Show(Window window, MousePosition position, double widthOffset = 0, double heightOffset = 0, bool visibility = true)
{
//获取鼠标位置
System.Windows.Point p = MouseUtil.GetMousePosition();
double left = SystemParameters.VirtualScreenLeft;
double top = SystemParameters.VirtualScreenTop;
double width = SystemParameters.VirtualScreenWidth;
double height = SystemParameters.WorkArea.Height + 20; // 不遮挡任务栏
double right = width - Math.Abs(left);
double bottom = height - Math.Abs(top);
double afterWidth;
double afterHeight;
switch (position)
{
case MousePosition.LEFT_BOTTOM:
afterWidth = 0;
afterHeight = window.Height;
break;
case MousePosition.LEFT_TOP:
afterWidth = 0;
afterHeight = 0;
break;
case MousePosition.LEFT_CENTER:
afterWidth = 0;
afterHeight = window.Height / 2;
break;
case MousePosition.RIGHT_BOTTOM:
afterWidth = window.Width;
afterHeight = window.Height;
break;
case MousePosition.RIGHT_TOP:
afterWidth = window.Width;
afterHeight = 0;
break;
case MousePosition.RIGHT_CENTER:
afterWidth = window.Width;
afterHeight = window.Height / 2;
break;
default:
afterWidth = window.Width / 2;
afterHeight = window.Height / 2;
break;
}
afterWidth += widthOffset;
afterHeight -= heightOffset;
if (p.X - afterWidth < left)
{
//判断是否在最左边缘
window.Left = left;
}
else if (p.X + afterWidth > right)
{
//判断是否在最右边缘
window.Left = right - window.Width;
}
else
{
window.Left = p.X - afterWidth;
}
if (p.Y - afterHeight < top)
{
//判断是否在最上边缘
window.Top = top;
}
else if (p.Y + afterHeight > bottom)
{
//判断是否在最下边缘
window.Top = bottom - window.Height;
}
else
{
window.Top = p.Y - afterHeight;
}
if (visibility)
{
window.Opacity = 0;
window.Visibility = Visibility.Visible;
}
}
}
}

View File

@@ -21,15 +21,18 @@ namespace GeekDesk.Util
string svgPath = "/GeekDesk;component/Resource/Iconfont/iconfont.js"; string svgPath = "/GeekDesk;component/Resource/Iconfont/iconfont.js";
string jsonPath = "/GeekDesk;component/Resource/Iconfont/iconfont.json"; string jsonPath = "/GeekDesk;component/Resource/Iconfont/iconfont.json";
Stream svgStream = Application.GetResourceStream(new Uri(svgPath, UriKind.Relative)).Stream;
Stream jsonStream = Application.GetResourceStream(new Uri(jsonPath, UriKind.Relative)).Stream;
StreamReader streamReader = new StreamReader(svgStream); using (Stream svgStream = Application.GetResourceStream(new Uri(svgPath, UriKind.Relative)).Stream,
jsonStream = Application.GetResourceStream(new Uri(jsonPath, UriKind.Relative)).Stream)
{
using (StreamReader streamReader = new StreamReader(svgStream))
{
string svgJsStr = streamReader.ReadToEnd(); string svgJsStr = streamReader.ReadToEnd();
JObject jo = ReadJson(jsonStream); JObject jo = ReadJson(jsonStream);
return GetIconfonts(svgJsStr, jo); return GetIconfonts(svgJsStr, jo);
} }
}
}
public static List<IconfontInfo> GetIconfonts(string svgJsStr, string jsonStr) public static List<IconfontInfo> GetIconfonts(string svgJsStr, string jsonStr)
{ {

34
Util/SystemIcon.cs Normal file
View File

@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace GeekDesk.Util
{
public class SystemIcon
{
[DllImport("Shell32.dll")]
public static extern int ExtractIcon(IntPtr h, string strx, int ii);
public static Icon MyExtractIcon(string FileName, int iIndex, IntPtr h)
{
try
{
IntPtr hIcon = (IntPtr)ExtractIcon(h, FileName, iIndex);
if (!hIcon.Equals(null))
{
Icon icon = Icon.FromHandle(hIcon);
return icon;
}
}
catch (Exception ex)
{
}
return null;
}
}
}

View File

@@ -1,12 +1,14 @@
 
using GeekDesk.Constant; using GeekDesk.Constant;
using GeekDesk.Util; using GeekDesk.Util;
using Newtonsoft.Json;
using System; using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
using System.Windows; using System.Windows;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using static GeekDesk.Util.GlobalHotKey;
/// <summary> /// <summary>
/// 程序设置 /// 程序设置
@@ -19,9 +21,9 @@ namespace GeekDesk.ViewModel
{ {
private SortType menuSortType = SortType.CUSTOM; //菜单排序类型 private SortType menuSortType = SortType.CUSTOM; //菜单排序类型
private SortType iconSortType = SortType.CUSTOM; //图表排序类型 private SortType iconSortType = SortType.CUSTOM; //图表排序类型
private double windowWidth = (double)MainWindowEnum.WINDOW_WIDTH; //窗口宽度 private double windowWidth = (double)CommonEnum.WINDOW_WIDTH; //窗口宽度
private double windowHeight = (double)MainWindowEnum.WINDOW_HEIGHT; //窗口高度 private double windowHeight = (double)CommonEnum.WINDOW_HEIGHT; //窗口高度
private double menuCardWidth = (double)MainWindowEnum.MENU_CARD_WIDHT;//菜单栏宽度 private double menuCardWidth = (double)CommonEnum.MENU_CARD_WIDHT;//菜单栏宽度
private int selectedMenuIndex = 0; //上次选中菜单索引 private int selectedMenuIndex = 0; //上次选中菜单索引
private bool followMouse = true; //面板跟随鼠标 默认是 private bool followMouse = true; //面板跟随鼠标 默认是
private Visibility configIconVisible = Visibility.Visible; // 设置按钮是否显示 private Visibility configIconVisible = Visibility.Visible; // 设置按钮是否显示
@@ -42,9 +44,9 @@ namespace GeekDesk.ViewModel
private HotkeyModifiers hotkeyModifiers = HotkeyModifiers.MOD_CONTROL; //默认启动面板快捷键 private HotkeyModifiers hotkeyModifiers = HotkeyModifiers.MOD_CONTROL; //默认启动面板快捷键
private Key hotkey = Key.Q; //默认启动面板快捷键 private Key hotkey = Key.Q; //默认启动面板快捷键
private string toDoHotkeyStr; //待办任务快捷键 private string toDoHotkeyStr = "Ctrl + Shift + Q"; //待办任务快捷键
private HotkeyModifiers toDoHotkeyModifiers; //待办任务快捷键 private HotkeyModifiers toDoHotkeyModifiers; //待办任务快捷键
private Key toDoHotkey; //待办任务快捷键 private Key toDoHotkey = Key.E; //待办任务快捷键
private string customIconUrl; //自定义图标url private string customIconUrl; //自定义图标url
private string customIconJsonUrl; //自定义图标json信息url private string customIconJsonUrl; //自定义图标json信息url
@@ -56,10 +58,211 @@ namespace GeekDesk.ViewModel
private bool selfStartUp = true; //开机自启动设置 private bool selfStartUp = true; //开机自启动设置
private bool selfStartUped = false; //是否已设置 private bool selfStartUped = false; //是否已设置
private bool pmModel = false; //性能模式 private bool pmModel = false; //性能模式
private string textColor = "#000000"; //字体颜色
private double imgPanelWidth = (double)CommonEnum.IMAGE_PANEL_WIDTH;
private double imgPanelHeight = (double)CommonEnum.IMAGE_PANEL_HEIGHT;
private bool marginHide = false; //贴边隐藏
private bool appAnimation = false; //主窗口动画效果
private int imageWidth = (int)CommonEnum.IMAGE_WIDTH; //图片宽度
private int imageHeight = (int)CommonEnum.IMAGE_HEIGHT; //图片高度
private bool mouseMiddleShow = false; //鼠标中键呼出 默认不启用
private bool showBarIcon = true; //显示托盘图标 默认显示
private bool doubleOpen = false; //双击打开项目 默认关闭
#region GetSet #region GetSet
public bool DoubleOpen
{
get
{
return doubleOpen;
}
set
{
doubleOpen = value;
OnPropertyChanged("DoubleOpen");
}
}
public bool ShowBarIcon
{
get
{
return showBarIcon;
}
set
{
showBarIcon = value;
OnPropertyChanged("ShowBarIcon");
}
}
public bool MouseMiddleShow
{
get
{
return mouseMiddleShow;
}
set
{
mouseMiddleShow = value;
OnPropertyChanged("MouseMiddleShow");
}
}
public int ImageWidth
{
get
{
// 为了兼容旧版 暂时使用默认
if (imageWidth == 0)
{
return (int)CommonEnum.IMAGE_WIDTH;
} else
{
return imageWidth;
}
}
set
{
imageWidth = value;
//同时设置高度
ImageHeight = value;
//计算 容器宽度因子
double i = ((double)imageWidth - (double)CommonEnum.IMAGE_WIDTH) / 5d;
double s = 2.44;
i *= 2d;
while (i > 1)
{
i /= 10d;
}
if (i > 0d)
{
s -= i;
}
if (s < 2.2)
{
s = 2.2;
}
//设置容器宽度
ImgPanelWidth = (int)(ImageWidth * s);
OnPropertyChanged("ImageWidth");
}
}
public int ImageHeight
{
get
{
//都使用宽度来确定大小
// 为了兼容旧版 暂时使用默认
if (imageHeight == 0)
{
return (int)CommonEnum.IMAGE_HEIGHT;
}
else
{
return imageHeight;
}
}
set
{
imageHeight = value;
//计算容器高度因子
double i = ((double)imageHeight - (double)CommonEnum.IMAGE_HEIGHT) / 5d;
while (i > 1)
{
i /= 10d;
}
double s = 2.00;
if (i > 0d)
{
s -= i;
}
if (s < 1.5) s = 1.5;
//设置容器高度
ImgPanelHeight = ImageHeight * s;
OnPropertyChanged("ImageHeight");
}
}
public bool AppAnimation
{
get
{
return appAnimation;
}
set
{
appAnimation = value;
OnPropertyChanged("AppAnimation");
}
}
public bool MarginHide
{
get
{
return marginHide;
}
set
{
marginHide = value;
OnPropertyChanged("MarginHide");
}
}
public double ImgPanelWidth
{
get
{
if (imgPanelWidth == 0d) return (double)CommonEnum.IMAGE_PANEL_WIDTH;
return imgPanelWidth;
}
set
{
imgPanelWidth = value;
OnPropertyChanged("ImgPanelWidth");
}
}
public double ImgPanelHeight
{
get
{
if (imgPanelHeight == 0d) return (double)CommonEnum.IMAGE_PANEL_HEIGHT;
return imgPanelHeight;
}
set
{
imgPanelHeight = value;
OnPropertyChanged("ImgPanelHeight");
}
}
public string TextColor
{
get
{
if (textColor == null) return "#000000";
return textColor;
}
set
{
textColor = value;
OnPropertyChanged("TextColor");
}
}
public bool PMModel public bool PMModel
{ {
@@ -105,6 +308,11 @@ namespace GeekDesk.ViewModel
{ {
get get
{ {
//兼容老版本
if (toDoHotkey == Key.None)
{
toDoHotkey = Key.Q;
}
return toDoHotkey; return toDoHotkey;
} }
set set
@@ -119,6 +327,10 @@ namespace GeekDesk.ViewModel
{ {
get get
{ {
if (toDoHotkeyModifiers == 0)
{
toDoHotkeyModifiers = HotkeyModifiers.MOD_CONTROL | HotkeyModifiers.MOD_SHIFT;
}
return toDoHotkeyModifiers; return toDoHotkeyModifiers;
} }
set set
@@ -132,6 +344,11 @@ namespace GeekDesk.ViewModel
{ {
get get
{ {
//兼容老版本
if (toDoHotkeyStr == null)
{
toDoHotkeyStr = "Ctrl + Shift + Q";
}
return toDoHotkeyStr; return toDoHotkeyStr;
} }
set set
@@ -238,6 +455,10 @@ namespace GeekDesk.ViewModel
{ {
get get
{ {
if (hotkeyModifiers == 0)
{
hotkeyModifiers = HotkeyModifiers.MOD_CONTROL;
}
return hotkeyModifiers; return hotkeyModifiers;
} }
set set
@@ -502,5 +723,9 @@ namespace GeekDesk.ViewModel
#endregion #endregion
public override String ToString()
{
return JsonConvert.SerializeObject(this);
}
} }
} }

View File

@@ -1,4 +1,5 @@
using GeekDesk.Util; using GeekDesk.Util;
using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
@@ -84,6 +85,11 @@ namespace GeekDesk.ViewModel
} }
} }
public override String ToString()
{
return JsonConvert.SerializeObject(this);
}
[field: NonSerializedAttribute()] [field: NonSerializedAttribute()]
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) private void OnPropertyChanged(string propertyName)

View File

@@ -1,8 +1,11 @@
using GeekDesk.Constant; using GeekDesk.Constant;
using GeekDesk.Util; using GeekDesk.Util;
using Newtonsoft.Json;
using System; using System;
using System.ComponentModel; using System.ComponentModel;
using System.IO; using System.IO;
using System.Reflection;
using System.Text;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
/// <summary> /// <summary>
@@ -20,12 +23,75 @@ namespace GeekDesk.ViewModel
private BitmapImage bitmapImage; //位图 private BitmapImage bitmapImage; //位图
private byte[] imageByteArr; //图片 byte数组 private byte[] imageByteArr; //图片 byte数组
private string content; //显示信息 private string content; //显示信息
private int imageWidth = (int)MainWindowEnum.IMAGE_WIDTH; //图片宽度
private int imageHeight = (int)MainWindowEnum.IMAGE_HEIGHT; //图片高度
private bool adminStartUp = false; //始终管理员方式启动 默认否 private bool adminStartUp = false; //始终管理员方式启动 默认否
private byte[] defaultImage; //默认图标 private byte[] defaultImage; //默认图标
private string startArg; //启动参数
private string lnkPath;
private IconType iconType = IconType.OTHER;
public string LnkPath_NoWrite
{
get
{
return lnkPath;
}
set
{
lnkPath = value;
}
}
public string LnkPath
{
get
{
return lnkPath;
}
set
{
lnkPath = value;
OnPropertyChanged("LnkPath");
}
}
public string StartArg
{
get
{
return startArg;
}
set
{
startArg = value;
OnPropertyChanged("StartArg");
}
}
public string StartArg_NoWrite
{
get
{
return startArg;
}
set
{
startArg = value;
}
}
public IconType IconType
{
get
{
if (iconType == 0) return IconType.OTHER;
return iconType;
}
set
{
iconType = value;
OnPropertyChanged("IconType");
}
}
public byte[] DefaultImage public byte[] DefaultImage
{ {
@@ -40,6 +106,18 @@ namespace GeekDesk.ViewModel
} }
} }
public byte[] DefaultImage_NoWrite
{
get
{
return defaultImage;
}
set
{
defaultImage = value;
}
}
public bool AdminStartUp public bool AdminStartUp
{ {
get get
@@ -62,7 +140,13 @@ namespace GeekDesk.ViewModel
set set
{ {
count = value; count = value;
if (StringUtil.IsEmpty(Path))
{
Content = Name + "\n使用次数: " + Count;
} else
{
Content = Path + "\n" + Name + "\n使用次数: " + Count; Content = Path + "\n" + Name + "\n使用次数: " + Count;
}
OnPropertyChanged("Count"); OnPropertyChanged("Count");
} }
} }
@@ -76,11 +160,30 @@ namespace GeekDesk.ViewModel
set set
{ {
name = value; name = value;
if (StringUtil.IsEmpty(Path))
{
Content = Name + "\n使用次数: " + Count;
}
else
{
Content = Path + "\n" + Name + "\n使用次数: " + Count; Content = Path + "\n" + Name + "\n使用次数: " + Count;
}
OnPropertyChanged("Name"); OnPropertyChanged("Name");
} }
} }
public string Name_NoWrite
{
get
{
return name;
}
set
{
name = value;
}
}
public string Path public string Path
{ {
get get
@@ -90,11 +193,31 @@ namespace GeekDesk.ViewModel
set set
{ {
path = value; path = value;
if (StringUtil.IsEmpty(Path))
{
Content = Name + "\n使用次数: " + Count;
}
else
{
Content = Path + "\n" + Name + "\n使用次数: " + Count; Content = Path + "\n" + Name + "\n使用次数: " + Count;
}
OnPropertyChanged("Path"); OnPropertyChanged("Path");
} }
} }
public string Path_NoWrite
{
get
{
return path;
}
set
{
path = value;
}
}
public BitmapImage BitmapImage public BitmapImage BitmapImage
{ {
get get
@@ -110,6 +233,20 @@ namespace GeekDesk.ViewModel
} }
} }
public BitmapImage BitmapImage_NoWrite
{
get
{
return ImageUtil.ByteArrToImage(ImageByteArr_NoWrite);
}
set
{
bitmapImage = value;
ImageByteArr_NoWrite = ImageUtil.BitmapImageToByte(bitmapImage);
}
}
public byte[] ImageByteArr public byte[] ImageByteArr
{ {
get get
@@ -124,6 +261,19 @@ namespace GeekDesk.ViewModel
} }
} }
public byte[] ImageByteArr_NoWrite
{
get
{
return imageByteArr;
}
set
{
imageByteArr = value;
}
}
public string Content public string Content
{ {
get get
@@ -137,37 +287,19 @@ namespace GeekDesk.ViewModel
} }
} }
public int ImageWidth
public string Content_NoWrite
{ {
get get
{ {
// 为了兼容旧版 暂时使用默认 return content;
return (int)MainWindowEnum.IMAGE_WIDTH;
} }
set set
{ {
imageWidth = value; content = value;
OnPropertyChanged("ImageWidth");
} }
} }
public int ImageHeight
{
get
{
// 为了兼容旧版 暂时使用默认
return (int)MainWindowEnum.IMAGE_HEIGHT;
}
set
{
imageHeight = value;
OnPropertyChanged("ImageHeight");
}
}
[field: NonSerializedAttribute()] [field: NonSerializedAttribute()]
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;

View File

@@ -1,4 +1,5 @@
using System; using Newtonsoft.Json;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@@ -36,5 +37,11 @@ namespace GeekDesk.ViewModel
name = value; name = value;
} }
} }
public override String ToString()
{
return JsonConvert.SerializeObject(this);
}
} }
} }

View File

@@ -1,5 +1,6 @@
using GeekDesk.Constant; using GeekDesk.Constant;
using GeekDesk.Util; using GeekDesk.Util;
using Newtonsoft.Json;
using System; using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
@@ -17,11 +18,23 @@ namespace GeekDesk.ViewModel
private string menuId; private string menuId;
private Visibility menuEdit = Visibility.Collapsed; private Visibility menuEdit = Visibility.Collapsed;
private Visibility notMenuEdit = Visibility.Visible; private Visibility notMenuEdit = Visibility.Visible;
private bool isEdit = false;
private string menuGeometry; //菜单几何图标 private string menuGeometry; //菜单几何图标
private string geometryColor; //几何图标颜色 private string geometryColor; //几何图标颜色
private ObservableCollection<IconInfo> iconList = new ObservableCollection<IconInfo>(); private ObservableCollection<IconInfo> iconList = new ObservableCollection<IconInfo>();
public bool IsEdit
{
get
{
return isEdit;
}
set
{
isEdit = value;
OnPropertyChanged("IsEdit");
}
}
public string MenuGeometry public string MenuGeometry
{ {
get get
@@ -93,9 +106,11 @@ namespace GeekDesk.ViewModel
menuEdit = value; menuEdit = value;
if (menuEdit == Visibility.Visible) if (menuEdit == Visibility.Visible)
{ {
IsEdit = true;
NotMenuEdit = Visibility.Collapsed; NotMenuEdit = Visibility.Collapsed;
} else } else
{ {
IsEdit = false;
NotMenuEdit = Visibility.Visible; NotMenuEdit = Visibility.Visible;
} }
OnPropertyChanged("MenuEdit"); OnPropertyChanged("MenuEdit");
@@ -128,6 +143,11 @@ namespace GeekDesk.ViewModel
} }
} }
public override String ToString()
{
return JsonConvert.SerializeObject(this);
}
[field: NonSerializedAttribute()] [field: NonSerializedAttribute()]
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) private void OnPropertyChanged(string propertyName)

View File

@@ -1,4 +1,6 @@
using GeekDesk.Util; using GeekDesk.Constant;
using GeekDesk.Util;
using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
@@ -17,8 +19,38 @@ namespace GeekDesk.ViewModel
private string msg; //事项详情 private string msg; //事项详情
private string exeTime; //待办时间 private string exeTime; //待办时间
private string doneTime; //完成时间 private string doneTime; //完成时间
private TodoTaskExecType execType = TodoTaskExecType.SET_TIME;
private string cron; //cron表达式
//private int status; //状态 0 未处理 1 已处理 //private int status; //状态 0 未处理 1 已处理
public string Cron
{
get
{
return cron;
}
set
{
cron = value;
OnPropertyChanged("Cron");
}
}
public TodoTaskExecType ExecType
{
get
{
//兼容老版本 需要给个默认值
if (execType == 0) return TodoTaskExecType.SET_TIME;
return execType;
}
set
{
execType = value;
OnPropertyChanged("ExecType");
}
}
public string DoneTime public string DoneTime
{ {
@@ -98,7 +130,10 @@ namespace GeekDesk.ViewModel
// } // }
//} //}
public override String ToString()
{
return JsonConvert.SerializeObject(this);
}
[field: NonSerializedAttribute()] [field: NonSerializedAttribute()]

View File

@@ -1,7 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="CommonServiceLocator" version="2.0.6" targetFramework="net452" requireReinstallation="true" /> <package id="CommonServiceLocator" version="2.0.6" targetFramework="net452" requireReinstallation="true" />
<package id="HandyControl" version="3.1.0" targetFramework="net472" /> <package id="HandyControl" version="3.3.0" targetFramework="net472" />
<package id="KeyMouseHook" version="1.0.6" targetFramework="net472" developmentDependency="true" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="2.1.1" targetFramework="net472" />
<package id="MouseKeyHook" version="5.6.0" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" /> <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
<package id="Quartz" version="3.3.3" targetFramework="net472" />
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
<package id="System.Diagnostics.DiagnosticSource" version="4.7.1" targetFramework="net472" />
<package id="System.Drawing.Common" version="6.0.0-preview.6.21352.12" targetFramework="net472" /> <package id="System.Drawing.Common" version="6.0.0-preview.6.21352.12" targetFramework="net472" />
<package id="System.Memory" version="4.5.4" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net472" />
</packages> </packages>