提交记录新增Core/App.config+27 −0看文件
修改Core/Core.csproj+101 −0看文件
新增Core/Enums/SleepStatus.cs+23 −0看文件
新增Core/Event/EventHandler.cs+14 −0看文件
新增Core/Event/ObserverEventHandler.cs+10 −0看文件
新增Core/Librarys/Iconer.cs+148 −0看文件
改名Core/Servicers/Instances/Logger.cs → Core/Librarys/Logger.cs+10 −13看文件
新增Core/Librarys/SQLite/SQLiteBuilder.cs+339 −0看文件
新增Core/Librarys/SQLite/SQLiteConfiguration.cs+22 −0看文件
新增Core/Librarys/SQLite/StatisticContext.cs+39 −0看文件
新增Core/Librarys/Shortcut.cs+76 −0看文件
修改Core/Librarys/Win32API.cs+169 −0看文件
新增Core/Models/Config/ConfigAttribute.cs+34 −0看文件
新增Core/Models/Config/ConfigModel.cs+25 −0看文件
新增Core/Models/Config/GeneralModel.cs+20 −0看文件
新增Core/Models/Config/Link/LinkModel.cs+22 −0看文件
新增Core/Models/DailyLogModel.cs+36 −0看文件
新增Core/Servicers/Instances/AppConfig.cs+115 −0看文件
新增Core/Servicers/Instances/Data.cs+164 −0看文件
新增Core/Servicers/Instances/DateObserver.cs+57 −0看文件
修改Core/Servicers/Instances/Main.cs+209 −2看文件
修改Core/Servicers/Instances/Observer.cs+76 −6看文件
新增Core/Servicers/Instances/Sleepdiscover.cs+111 −0看文件
新增Core/Servicers/Interfaces/IAppConfig.cs+36 −0看文件
新增Core/Servicers/Interfaces/IData.cs+67 −0看文件
新增Core/Servicers/Interfaces/IDateObserver.cs+23 −0看文件
删除Core/Servicers/Interfaces/ILogger.cs+0 −16
修改Core/Servicers/Interfaces/IMain.cs+5 −0看文件
修改Core/Servicers/Interfaces/IObserver.cs+7 −1看文件
新增Core/Servicers/Interfaces/ISleepdiscover.cs+22 −0看文件
新增Core/packages.config+15 −0看文件
修改Tai.sln+10 −0看文件
修改UI/App.config+4 −0看文件
修改UI/App.xaml.cs+72 −7看文件
新增UI/Controls/Base/EmptyData.cs+18 −0看文件
修改UI/Controls/Base/IconConverter.cs+1 −0看文件
修改UI/Controls/Base/IconTypes.cs+2 −1看文件
新增UI/Controls/Base/Placeholder.cs+60 −0看文件
新增UI/Controls/Button/Button.cs+40 −0看文件
新增UI/Controls/Button/IconButton.cs+55 −0看文件
新增UI/Controls/Charts/Charts.cs+489 −0看文件
新增UI/Controls/Charts/ChartsItemTypeA.cs+121 −0看文件
新增UI/Controls/Charts/ChartsItemTypeCard.cs+129 −0看文件
新增UI/Controls/Charts/ChartsItemTypeMonth.cs+158 −0看文件
新增UI/Controls/Charts/ChartsType.cs+27 −0看文件
新增UI/Controls/Charts/Model/ChartsDataModel.cs+42 −0看文件
新增UI/Controls/DatePickerBar/DatePickerBar.cs+285 −0看文件
新增UI/Controls/DatePickerBar/DatePickerBarItem.cs+58 −0看文件
新增UI/Controls/DatePickerBar/DatePickerShowType.cs+23 −0看文件
新增UI/Controls/Input/InputBox.cs+23 −0看文件
新增UI/Controls/List/BaseList.cs+131 −0看文件
新增UI/Controls/List/BaseListItem.cs+40 −0看文件
修改UI/Controls/Navigation/Navigation.cs+6 −1看文件
新增UI/Controls/SettingPanel/SettingPanel.cs+326 −0看文件
新增UI/Controls/SettingPanel/SettingPanelItem.cs+36 −0看文件
新增UI/Controls/SettingPanel/SettingPanelMultiItem.cs+241 −0看文件
新增UI/Controls/Tabbar/Tabbar.cs+299 −0看文件
新增UI/Controls/Toggle/Toggle.cs+72 −0看文件
修改UI/Controls/Window/DefaultWindow.cs+11 −0看文件
新增UI/Extensions/ListExtensions.cs+39 −0看文件
新增UI/Librays/Image/Imager.cs+58 −0看文件
新增UI/Librays/Timer.cs+37 −0看文件
修改UI/MainWindow.xaml+5 −11看文件
新增UI/Models/DataPageModel.cs+33 −0看文件
新增UI/Models/DetailPageModel.cs+44 −0看文件
新增UI/Models/IndexPageModel.cs+51 −0看文件
新增UI/Models/SettingPageModel.cs+35 −0看文件
修改UI/Properties/AssemblyInfo.cs+5 −5看文件
新增UI/Resources/Icons/defaultIcon.png看文件 新增UI/Resources/Icons/tai.ico看文件 删除UI/TextTemplate.ico 新增UI/Themes/Base/EmptyData.xaml+33 −0看文件
新增UI/Themes/Base/Placeholder.xaml+32 −0看文件
新增UI/Themes/Button/Button.xaml+92 −0看文件
新增UI/Themes/Button/IconButton.xaml+54 −0看文件
新增UI/Themes/Charts/Charts.xaml+50 −0看文件
新增UI/Themes/Charts/ChartsItemTypeA.xaml+87 −0看文件
新增UI/Themes/Charts/ChartsItemTypeCard.xaml+80 −0看文件
新增UI/Themes/Charts/ChartsItemTypeMonth.xaml+74 −0看文件
新增UI/Themes/DatePickerBar/DatePickerBar.xaml+36 −0看文件
新增UI/Themes/DatePickerBar/DatePickerBarItem.xaml+42 −0看文件
修改UI/Themes/Generic.xaml+23 −2看文件
新增UI/Themes/Input/InputBox.xaml+59 −0看文件
新增UI/Themes/List/BaseList.xaml+38 −0看文件
新增UI/Themes/List/BaseListItem.xaml+83 −0看文件
修改UI/Themes/Navigation/Navigation.xaml+1 −1看文件
修改UI/Themes/Navigation/NavigationItem.xaml+1 −1看文件
新增UI/Themes/SettingPanel/SettingPanel.xaml+26 −0看文件
新增UI/Themes/SettingPanel/SettingPanelItem.xaml+47 −0看文件
新增UI/Themes/SettingPanel/SettingPanelMultiItem.xaml+53 −0看文件
新增UI/Themes/Tabbar/Tabbar.xaml+34 −0看文件
新增UI/Themes/Toggle/Toggle.xaml+78 −0看文件
修改UI/Themes/Window/DefaultWindow.xaml+4 −4看文件
修改UI/UI.csproj+175 −3看文件
新增UI/ViewModels/DataPageVM.cs+95 −0看文件
新增UI/ViewModels/DetailPageVM.cs+127 −0看文件
新增UI/ViewModels/IndexPageVM.cs+144 −0看文件
修改UI/ViewModels/MainViewModel.cs+3 −2看文件
新增UI/ViewModels/SettingPageVM.cs+87 −0看文件
新增UI/Views/DataPage.xaml+40 −0看文件
新增UI/Views/DataPage.xaml.cs+30 −0看文件
新增UI/Views/DetailPage.xaml+72 −0看文件
新增UI/Views/DetailPage.xaml.cs+28 −0看文件
修改UI/Views/IndexPage.xaml+24 −2看文件
修改UI/Views/IndexPage.xaml.cs+2 −0看文件
新增UI/Views/SettingPage.xaml+63 −0看文件
新增UI/Views/SettingPage.xaml.cs+28 −0看文件
| @@ -0,0 +1,27 @@ | ||
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 新增:<configuration> | |
| 3 | 新增: <configSections> | |
| 4 | 新增: <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> | |
| 5 | 新增: <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> | |
| 6 | 新增: </configSections> | |
| 7 | 新增: <entityFramework> | |
| 8 | 新增: <providers> | |
| 9 | 新增: <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> | |
| 10 | 新增: <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> | |
| 11 | 新增: </providers> | |
| 12 | 新增: </entityFramework> | |
| 13 | 新增: <system.data> | |
| 14 | 新增: <DbProviderFactories> | |
| 15 | 新增: <remove invariant="System.Data.SQLite.EF6" /> | |
| 16 | 新增: <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> | |
| 17 | 新增: </DbProviderFactories> | |
| 18 | 新增: </system.data> | |
| 19 | 新增: <runtime> | |
| 20 | 新增: <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> | |
| 21 | 新增: <dependentAssembly> | |
| 22 | 新增: <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" /> | |
| 23 | 新增: <bindingRedirect oldVersion="0.0.0.0-1.0.115.5" newVersion="1.0.115.5" /> | |
| 24 | 新增: </dependentAssembly> | |
| 25 | 新增: </assemblyBinding> | |
| 26 | 新增: </runtime> | |
| 27 | 新增:</configuration> | |
| 文件末尾没有换行 | ||
| @@ -1,6 +1,13 @@ | ||
| 1 | 1 | <?xml version="1.0" encoding="utf-8"?> |
| 2 | 2 | <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
| 3 | 新增: <Import Project="..\packages\EntityFramework.6.3.0\build\EntityFramework.props" Condition="Exists('..\packages\EntityFramework.6.3.0\build\EntityFramework.props')" /> | |
| 3 | 4 | <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |
| 5 | 新增: <PropertyGroup> | |
| 6 | 新增: <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles> | |
| 7 | 新增: <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles> | |
| 8 | 新增: <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles> | |
| 9 | 新增: <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles> | |
| 10 | 新增: </PropertyGroup> | |
| 4 | 11 | <PropertyGroup> |
| 5 | 12 | <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
| 6 | 13 | <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
| @@ -13,6 +20,8 @@ | ||
| 13 | 20 | <FileAlignment>512</FileAlignment> |
| 14 | 21 | <Deterministic>true</Deterministic> |
| 15 | 22 | <TargetFrameworkProfile /> |
| 23 | 新增: <NuGetPackageImportStamp> | |
| 24 | 新增: </NuGetPackageImportStamp> | |
| 16 | 25 | </PropertyGroup> |
| 17 | 26 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
| 18 | 27 | <DebugSymbols>true</DebugSymbols> |
| @@ -31,24 +40,116 @@ | ||
| 31 | 40 | <ErrorReport>prompt</ErrorReport> |
| 32 | 41 | <WarningLevel>4</WarningLevel> |
| 33 | 42 | </PropertyGroup> |
| 43 | 新增: <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> | |
| 44 | 新增: <DebugSymbols>true</DebugSymbols> | |
| 45 | 新增: <OutputPath>bin\x64\Debug\</OutputPath> | |
| 46 | 新增: <DefineConstants>DEBUG;TRACE</DefineConstants> | |
| 47 | 新增: <DebugType>full</DebugType> | |
| 48 | 新增: <PlatformTarget>x64</PlatformTarget> | |
| 49 | 新增: <LangVersion>7.3</LangVersion> | |
| 50 | 新增: <ErrorReport>prompt</ErrorReport> | |
| 51 | 新增: </PropertyGroup> | |
| 52 | 新增: <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> | |
| 53 | 新增: <OutputPath>bin\x64\Release\</OutputPath> | |
| 54 | 新增: <DefineConstants>TRACE</DefineConstants> | |
| 55 | 新增: <Optimize>true</Optimize> | |
| 56 | 新增: <DebugType>pdbonly</DebugType> | |
| 57 | 新增: <PlatformTarget>x64</PlatformTarget> | |
| 58 | 新增: <LangVersion>7.3</LangVersion> | |
| 59 | 新增: <ErrorReport>prompt</ErrorReport> | |
| 60 | 新增: </PropertyGroup> | |
| 34 | 61 | <ItemGroup> |
| 62 | 新增: <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> | |
| 63 | 新增: <HintPath>..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.dll</HintPath> | |
| 64 | 新增: </Reference> | |
| 65 | 新增: <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> | |
| 66 | 新增: <HintPath>..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.SqlServer.dll</HintPath> | |
| 67 | 新增: </Reference> | |
| 68 | 新增: <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> | |
| 69 | 新增: <HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> | |
| 70 | 新增: </Reference> | |
| 71 | 新增: <Reference Include="PresentationCore" /> | |
| 72 | 新增: <Reference Include="SQLitePCLRaw.core, Version=2.0.6.1341, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL"> | |
| 73 | 新增: <HintPath>..\packages\SQLitePCLRaw.core.2.0.6\lib\netstandard2.0\SQLitePCLRaw.core.dll</HintPath> | |
| 74 | 新增: </Reference> | |
| 35 | 75 | <Reference Include="System" /> |
| 76 | 新增: <Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> | |
| 77 | 新增: <HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath> | |
| 78 | 新增: </Reference> | |
| 79 | 新增: <Reference Include="System.ComponentModel.DataAnnotations" /> | |
| 36 | 80 | <Reference Include="System.Core" /> |
| 81 | 新增: <Reference Include="System.Data.SQLite, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL"> | |
| 82 | 新增: <HintPath>..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\lib\net46\System.Data.SQLite.dll</HintPath> | |
| 83 | 新增: </Reference> | |
| 84 | 新增: <Reference Include="System.Data.SQLite.EF6, Version=1.0.113.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL"> | |
| 85 | 新增: <HintPath>..\packages\System.Data.SQLite.EF6.1.0.113.0\lib\net46\System.Data.SQLite.EF6.dll</HintPath> | |
| 86 | 新增: </Reference> | |
| 87 | 新增: <Reference Include="System.Data.SQLite.Linq, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL"> | |
| 88 | 新增: <HintPath>..\packages\System.Data.SQLite.Linq.1.0.115.5\lib\net46\System.Data.SQLite.Linq.dll</HintPath> | |
| 89 | 新增: </Reference> | |
| 90 | 新增: <Reference Include="System.Drawing" /> | |
| 91 | 新增: <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> | |
| 92 | 新增: <HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath> | |
| 93 | 新增: </Reference> | |
| 94 | 新增: <Reference Include="System.Numerics" /> | |
| 95 | 新增: <Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> | |
| 96 | 新增: <HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath> | |
| 97 | 新增: </Reference> | |
| 98 | 新增: <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> | |
| 99 | 新增: <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath> | |
| 100 | 新增: </Reference> | |
| 37 | 101 | <Reference Include="System.Xml.Linq" /> |
| 38 | 102 | <Reference Include="System.Data.DataSetExtensions" /> |
| 39 | 103 | <Reference Include="Microsoft.CSharp" /> |
| 40 | 104 | <Reference Include="System.Data" /> |
| 41 | 105 | <Reference Include="System.Net.Http" /> |
| 42 | 106 | <Reference Include="System.Xml" /> |
| 107 | 新增: <Reference Include="WindowsBase" /> | |
| 43 | 108 | </ItemGroup> |
| 44 | 109 | <ItemGroup> |
| 110 | 新增: <Compile Include="Enums\SleepStatus.cs" /> | |
| 111 | 新增: <Compile Include="Event\EventHandler.cs" /> | |
| 112 | 新增: <Compile Include="Event\ObserverEventHandler.cs" /> | |
| 113 | 新增: <Compile Include="Librarys\Shortcut.cs" /> | |
| 114 | 新增: <Compile Include="Librarys\Iconer.cs" /> | |
| 115 | 新增: <Compile Include="Librarys\SQLite\SQLiteBuilder.cs" /> | |
| 116 | 新增: <Compile Include="Librarys\SQLite\SQLiteConfiguration.cs" /> | |
| 117 | 新增: <Compile Include="Librarys\SQLite\StatisticContext.cs" /> | |
| 45 | 118 | <Compile Include="Librarys\Win32API.cs" /> |
| 119 | 新增: <Compile Include="Models\Config\ConfigAttribute.cs" /> | |
| 120 | 新增: <Compile Include="Models\Config\ConfigModel.cs" /> | |
| 121 | 新增: <Compile Include="Models\Config\GeneralModel.cs" /> | |
| 122 | 新增: <Compile Include="Models\Config\Link\LinkModel.cs" /> | |
| 123 | 新增: <Compile Include="Models\DailyLogModel.cs" /> | |
| 46 | 124 | <Compile Include="Properties\AssemblyInfo.cs" /> |
| 125 | 新增: <Compile Include="Servicers\Instances\AppConfig.cs" /> | |
| 126 | 新增: <Compile Include="Servicers\Instances\Data.cs" /> | |
| 127 | 新增: <Compile Include="Librarys\Logger.cs" /> | |
| 128 | 新增: <Compile Include="Servicers\Instances\DateObserver.cs" /> | |
| 47 | 129 | <Compile Include="Servicers\Instances\Main.cs" /> |
| 48 | 130 | <Compile Include="Servicers\Instances\Observer.cs" /> |
| 131 | 新增: <Compile Include="Servicers\Instances\Sleepdiscover.cs" /> | |
| 132 | 新增: <Compile Include="Servicers\Interfaces\IAppConfig.cs" /> | |
| 133 | 新增: <Compile Include="Servicers\Interfaces\IData.cs" /> | |
| 134 | 新增: <Compile Include="Servicers\Interfaces\IDateObserver.cs" /> | |
| 49 | 135 | <Compile Include="Servicers\Interfaces\IMain.cs" /> |
| 50 | 136 | <Compile Include="Servicers\Interfaces\IObserver.cs" /> |
| 137 | 新增: <Compile Include="Servicers\Interfaces\ISleepdiscover.cs" /> | |
| 138 | 新增: </ItemGroup> | |
| 139 | 新增: <ItemGroup> | |
| 140 | 新增: <None Include="App.config" /> | |
| 141 | 新增: <None Include="packages.config" /> | |
| 51 | 142 | </ItemGroup> |
| 52 | 143 | <ItemGroup /> |
| 53 | 144 | <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
| 145 | 新增: <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> | |
| 146 | 新增: <PropertyGroup> | |
| 147 | 新增: <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText> | |
| 148 | 新增: </PropertyGroup> | |
| 149 | 新增: <Error Condition="!Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets'))" /> | |
| 150 | 新增: <Error Condition="!Exists('..\packages\EntityFramework.6.3.0\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.3.0\build\EntityFramework.props'))" /> | |
| 151 | 新增: <Error Condition="!Exists('..\packages\EntityFramework.6.3.0\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.3.0\build\EntityFramework.targets'))" /> | |
| 152 | 新增: </Target> | |
| 153 | 新增: <Import Project="..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" /> | |
| 154 | 新增: <Import Project="..\packages\EntityFramework.6.3.0\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.3.0\build\EntityFramework.targets')" /> | |
| 54 | 155 | </Project> |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,23 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Core.Enums | |
| 8 | 新增:{ | |
| 9 | 新增: /// <summary> | |
| 10 | 新增: /// 休眠状态 | |
| 11 | 新增: /// </summary> | |
| 12 | 新增: public enum SleepStatus | |
| 13 | 新增: { | |
| 14 | 新增: /// <summary> | |
| 15 | 新增: /// 醒着 | |
| 16 | 新增: /// </summary> | |
| 17 | 新增: Wake, | |
| 18 | 新增: /// <summary> | |
| 19 | 新增: /// 睡眠 | |
| 20 | 新增: /// </summary> | |
| 21 | 新增: Sleep, | |
| 22 | 新增: } | |
| 23 | 新增:} | |
| @@ -0,0 +1,14 @@ | ||
| 1 | 新增:using Core.Enums; | |
| 2 | 新增:using Core.Models.Config; | |
| 3 | 新增:using System; | |
| 4 | 新增:using System.Collections.Generic; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增: | |
| 9 | 新增:namespace Core.Event | |
| 10 | 新增:{ | |
| 11 | 新增: public delegate void SleepdiscoverEventHandler(SleepStatus sleepStatus); | |
| 12 | 新增: | |
| 13 | 新增: public delegate void AppConfigEventHandler(ConfigModel oldConfig, ConfigModel newConfig); | |
| 14 | 新增:} | |
| @@ -0,0 +1,10 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Core.Event | |
| 8 | 新增:{ | |
| 9 | 新增: public delegate void ObserverEventHandler(string processName, string description, string file); | |
| 10 | 新增:} | |
| @@ -0,0 +1,148 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Diagnostics; | |
| 4 | 新增:using System.Drawing; | |
| 5 | 新增:using System.IO; | |
| 6 | 新增:using System.Linq; | |
| 7 | 新增:using System.Text; | |
| 8 | 新增:using System.Text.RegularExpressions; | |
| 9 | 新增:using System.Threading.Tasks; | |
| 10 | 新增:using System.Windows; | |
| 11 | 新增:using System.Windows.Interop; | |
| 12 | 新增:using System.Windows.Media; | |
| 13 | 新增:using System.Windows.Media.Imaging; | |
| 14 | 新增:using System.Xml; | |
| 15 | 新增:using System.Xml.Serialization; | |
| 16 | 新增: | |
| 17 | 新增:namespace Core.Librarys | |
| 18 | 新增:{ | |
| 19 | 新增: public class Iconer | |
| 20 | 新增: { | |
| 21 | 新增: public static string Get(string processname, string desc) | |
| 22 | 新增: { | |
| 23 | 新增: string iconName = (processname + desc).Replace(" ", "") + ".png"; | |
| 24 | 新增: string iconPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, | |
| 25 | 新增: "AppIcons", iconName); | |
| 26 | 新增: if (!File.Exists(iconPath)) | |
| 27 | 新增: { | |
| 28 | 新增: return "pack://application:,,,/Tai;component/Resources/Icons/defaultIcon.png"; | |
| 29 | 新增: } | |
| 30 | 新增: return iconPath; | |
| 31 | 新增: } | |
| 32 | 新增: /// <summary> | |
| 33 | 新增: /// 提取icon为Png格式并保存到程序目录下 | |
| 34 | 新增: /// </summary> | |
| 35 | 新增: /// <param name="file"></param> | |
| 36 | 新增: /// <param name="processname"></param> | |
| 37 | 新增: /// <param name="desc"></param> | |
| 38 | 新增: /// <returns>返回提取到程序目录下的路径</returns> | |
| 39 | 新增: public static string ExtractFromFile(string file, string processname, string desc, bool isCheck = true) | |
| 40 | 新增: { | |
| 41 | 新增: try | |
| 42 | 新增: { | |
| 43 | 新增: string iconName = (processname + desc).Replace(" ", "") + ".png"; | |
| 44 | 新增: string iconPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, | |
| 45 | 新增: "AppIcons", iconName); | |
| 46 | 新增: if (isCheck && File.Exists(iconPath)) | |
| 47 | 新增: { | |
| 48 | 新增: return iconPath; | |
| 49 | 新增: } | |
| 50 | 新增: string dir = Path.GetDirectoryName(iconPath); | |
| 51 | 新增: if (!Directory.Exists(dir)) | |
| 52 | 新增: { | |
| 53 | 新增: Directory.CreateDirectory(dir); | |
| 54 | 新增: } | |
| 55 | 新增: | |
| 56 | 新增: // uwp app icon handle | |
| 57 | 新增: | |
| 58 | 新增: if (file.IndexOf("WindowsApps") != -1) | |
| 59 | 新增: { | |
| 60 | 新增: // 只有在包含此关键字时才去处理 | |
| 61 | 新增: | |
| 62 | 新增: // 继续判断是否是uwp程序 | |
| 63 | 新增: string appdir = file.Substring(0, file.Length - file.Split('\\').Last().Length); | |
| 64 | 新增: string appxManifestPath = appdir + "AppxManifest.xml"; | |
| 65 | 新增: if (File.Exists(appxManifestPath)) | |
| 66 | 新增: { | |
| 67 | 新增: // 是uwp程序 | |
| 68 | 新增: Debug.WriteLine("is uwp!" + appxManifestPath); | |
| 69 | 新增: // 读取描述文件 | |
| 70 | 新增: string manifestText = File.ReadAllText(appxManifestPath); | |
| 71 | 新增: var match = Regex.Match(manifestText, @"<Logo>(.*?)</Logo>"); | |
| 72 | 新增: string logoName = match.Groups[1].Value; | |
| 73 | 新增: | |
| 74 | 新增: string iconFile = string.Empty; | |
| 75 | 新增: | |
| 76 | 新增: string logo100 = logoName.Replace(".png", ".scale-100.png"); | |
| 77 | 新增: string logo125 = logoName.Replace(".png", ".scale-125.png"); | |
| 78 | 新增: string logo150 = logoName.Replace(".png", ".scale-150.png"); | |
| 79 | 新增: string logo200 = logoName.Replace(".png", ".scale-200.png"); | |
| 80 | 新增: string logo400 = logoName.Replace(".png", ".scale-400.png"); | |
| 81 | 新增: | |
| 82 | 新增: if (File.Exists(appdir + logo100)) | |
| 83 | 新增: { | |
| 84 | 新增: iconFile = appdir + logo100; | |
| 85 | 新增: } | |
| 86 | 新增: else if (File.Exists(appdir + logo125)) | |
| 87 | 新增: { | |
| 88 | 新增: iconFile = appdir + logo125; | |
| 89 | 新增: } | |
| 90 | 新增: else if (File.Exists(appdir + logo150)) | |
| 91 | 新增: { | |
| 92 | 新增: iconFile = appdir + logo150; | |
| 93 | 新增: } | |
| 94 | 新增: else if (File.Exists(appdir + logo200)) | |
| 95 | 新增: { | |
| 96 | 新增: iconFile = appdir + logo200; | |
| 97 | 新增: } | |
| 98 | 新增: else if (File.Exists(appdir + logo400)) | |
| 99 | 新增: { | |
| 100 | 新增: iconFile = appdir + logo400; | |
| 101 | 新增: } | |
| 102 | 新增: else | |
| 103 | 新增: { | |
| 104 | 新增: return string.Empty; | |
| 105 | 新增: } | |
| 106 | 新增: | |
| 107 | 新增: if (!string.IsNullOrEmpty(iconFile) && File.Exists(iconFile)) | |
| 108 | 新增: { | |
| 109 | 新增: // copy to tai dir | |
| 110 | 新增: | |
| 111 | 新增: File.Copy(iconFile, iconPath); | |
| 112 | 新增: return iconPath; | |
| 113 | 新增: } | |
| 114 | 新增: return string.Empty; | |
| 115 | 新增: } | |
| 116 | 新增: } | |
| 117 | 新增: | |
| 118 | 新增: | |
| 119 | 新增: | |
| 120 | 新增: // exe app icon handle | |
| 121 | 新增: | |
| 122 | 新增: Icon ico = Icon.ExtractAssociatedIcon(file); | |
| 123 | 新增: | |
| 124 | 新增: using (var fileStream = new FileStream(iconPath, FileMode.Create)) | |
| 125 | 新增: { | |
| 126 | 新增: BitmapEncoder encoder = new PngBitmapEncoder(); | |
| 127 | 新增: encoder.Frames.Add(BitmapFrame.Create(ToImageSource(ico) as BitmapSource)); | |
| 128 | 新增: encoder.Save(fileStream); | |
| 129 | 新增: } | |
| 130 | 新增: return iconPath; | |
| 131 | 新增: } | |
| 132 | 新增: catch (Exception ex) | |
| 133 | 新增: { | |
| 134 | 新增: Logger.Error(ex.Message + ",File: " + file + ",Process: " + processname); | |
| 135 | 新增: return string.Empty; | |
| 136 | 新增: } | |
| 137 | 新增: } | |
| 138 | 新增: public static ImageSource ToImageSource(Icon icon) | |
| 139 | 新增: { | |
| 140 | 新增: ImageSource imageSource = Imaging.CreateBitmapSourceFromHIcon( | |
| 141 | 新增: icon.Handle, | |
| 142 | 新增: Int32Rect.Empty, | |
| 143 | 新增: BitmapSizeOptions.FromEmptyOptions()); | |
| 144 | 新增: | |
| 145 | 新增: return imageSource; | |
| 146 | 新增: } | |
| 147 | 新增: } | |
| 148 | 新增:} | |
| @@ -8,48 +8,45 @@ using System.Runtime.CompilerServices; | ||
| 8 | 8 | using System.Text; |
| 9 | 9 | using System.Threading.Tasks; |
| 10 | 10 | |
| 11 | 删除:namespace Core.Servicers.Instances | |
| 11 | 新增:namespace Core.Librarys | |
| 12 | 12 | { |
| 13 | 删除: public class Logger : ILogger | |
| 13 | 新增: public class Logger | |
| 14 | 14 | { |
| 15 | 15 | private static readonly object writeLock = new object(); |
| 16 | 删除: private string loggerName; | |
| 16 | 新增: private static string loggerName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, | |
| 17 | 新增: "Log", DateTime.Now.ToString("yyyy-MM-dd") + ".log"); | |
| 17 | 18 | private enum LogLevel |
| 18 | 19 | { |
| 19 | 20 | Info, |
| 20 | 21 | Warn, |
| 21 | 22 | Error, |
| 22 | 23 | } |
| 23 | 删除: public Logger() | |
| 24 | 删除: { | |
| 25 | 删除: loggerName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, | |
| 26 | 删除: "Log", DateTime.Now.ToString("yyyy-MM-dd") + ".log"); | |
| 27 | 删除: } | |
| 28 | 删除: public void Info(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null) | |
| 24 | 新增: | |
| 25 | 新增: public static void Info(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null) | |
| 29 | 26 | { |
| 30 | 27 | message = message + "\r\n[Caller Info] Line:" + callerLineNumber + ",File:" + callerFilePath + ",name:" + callerMemberName; |
| 31 | 28 | Save(Fromat(LogLevel.Info, message)); |
| 32 | 29 | } |
| 33 | 30 | |
| 34 | 删除: public void Warn(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null) | |
| 31 | 新增: public static void Warn(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null) | |
| 35 | 32 | { |
| 36 | 33 | message = message + "\r\n[Caller Info] Line:" + callerLineNumber + ",File:" + callerFilePath + ",name:" + callerMemberName; |
| 37 | 34 | Save(Fromat(LogLevel.Warn, message)); |
| 38 | 35 | } |
| 39 | 删除: public void Error(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null) | |
| 36 | 新增: public static void Error(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null) | |
| 40 | 37 | { |
| 41 | 38 | message = message + "\r\n[Caller Info] Line:" + callerLineNumber + ",File:" + callerFilePath + ",name:" + callerMemberName; |
| 42 | 39 | Save(Fromat(LogLevel.Error, message)); |
| 43 | 40 | } |
| 44 | 41 | |
| 45 | 删除: private string Fromat(LogLevel logLevel, string message) | |
| 42 | 新增: private static string Fromat(LogLevel logLevel, string message) | |
| 46 | 43 | { |
| 47 | 44 | string logText = $"[{logLevel.ToString()}] [{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] \r\n{message}\r\n------------------------\r\n\r\n"; |
| 48 | 45 | Debug.WriteLine(logText); |
| 49 | 46 | return logText; |
| 50 | 47 | } |
| 51 | 48 | |
| 52 | 删除: private void Save(string message) | |
| 49 | 新增: private static void Save(string message) | |
| 53 | 50 | { |
| 54 | 51 | lock (writeLock) |
| 55 | 52 | { |
| @@ -0,0 +1,339 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Data.SQLite; | |
| 4 | 新增:using System.IO; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Reflection; | |
| 7 | 新增:using System.Text; | |
| 8 | 新增:using System.Threading.Tasks; | |
| 9 | 新增: | |
| 10 | 新增:namespace Core.Librarys.SQLite | |
| 11 | 新增:{ | |
| 12 | 新增: /// <summary> | |
| 13 | 新增: /// 数据模型信息接口 | |
| 14 | 新增: /// </summary> | |
| 15 | 新增: public class IModelInfo | |
| 16 | 新增: { | |
| 17 | 新增: /// <summary> | |
| 18 | 新增: /// 模型名 | |
| 19 | 新增: /// </summary> | |
| 20 | 新增: public string Name { get; set; } | |
| 21 | 新增: /// <summary> | |
| 22 | 新增: /// 模型数据库表名 | |
| 23 | 新增: /// </summary> | |
| 24 | 新增: public string TableName { get { return Name + "s"; } } | |
| 25 | 新增: /// <summary> | |
| 26 | 新增: /// 获取模型所有属性 | |
| 27 | 新增: /// </summary> | |
| 28 | 新增: public List<IModelProperties> Properties { get; set; } | |
| 29 | 新增: } | |
| 30 | 新增: /// <summary> | |
| 31 | 新增: /// 模型属性接口 | |
| 32 | 新增: /// </summary> | |
| 33 | 新增: public class IModelProperties | |
| 34 | 新增: { | |
| 35 | 新增: /// <summary> | |
| 36 | 新增: /// 列名 | |
| 37 | 新增: /// </summary> | |
| 38 | 新增: public string Name { get; set; } | |
| 39 | 新增: public string Type { get; set; } | |
| 40 | 新增: public bool PK { get; set; } | |
| 41 | 新增: public bool NotNull { get { return !PK; } } | |
| 42 | 新增: } | |
| 43 | 新增: /// <summary> | |
| 44 | 新增: ///handle sqlite code first | |
| 45 | 新增: /// </summary> | |
| 46 | 新增: public class SQLiteBuilder | |
| 47 | 新增: { | |
| 48 | 新增: private System.Data.Entity.Infrastructure.DbModel model; | |
| 49 | 新增: /// <summary> | |
| 50 | 新增: /// 连接字符串 | |
| 51 | 新增: /// </summary> | |
| 52 | 新增: private string connstr; | |
| 53 | 新增: /// <summary> | |
| 54 | 新增: /// 数据库版本文件 | |
| 55 | 新增: /// </summary> | |
| 56 | 新增: private string versionFile; | |
| 57 | 新增: /// <summary> | |
| 58 | 新增: /// 数据模型 | |
| 59 | 新增: /// </summary> | |
| 60 | 新增: private System.Data.Entity.Core.Metadata.Edm.EdmModel storeModel; | |
| 61 | 新增: private System.Data.Entity.Core.Common.DbProviderManifest providerManifest; | |
| 62 | 新增: public SQLiteBuilder(System.Data.Entity.Infrastructure.DbModel model) | |
| 63 | 新增: { | |
| 64 | 新增: this.model = model; | |
| 65 | 新增: | |
| 66 | 新增: if (model != null) | |
| 67 | 新增: { | |
| 68 | 新增: connstr = model.ProviderInfo.ProviderManifestToken; | |
| 69 | 新增: | |
| 70 | 新增: storeModel = model.StoreModel; | |
| 71 | 新增: | |
| 72 | 新增: providerManifest = model.ProviderManifest; | |
| 73 | 新增: | |
| 74 | 新增: versionFile = connstr.Split('=')[1] + ".version"; | |
| 75 | 新增: } | |
| 76 | 新增: } | |
| 77 | 新增: | |
| 78 | 新增: public void Handle() | |
| 79 | 新增: { | |
| 80 | 新增: if (IsHandleDb()) | |
| 81 | 新增: { | |
| 82 | 新增: HandleTable(); | |
| 83 | 新增: } | |
| 84 | 新增: } | |
| 85 | 新增: | |
| 86 | 新增: /// <summary> | |
| 87 | 新增: /// 处理表变化(仅处理新增表、新增表字段。不处理表名更改、列名更改、删除) | |
| 88 | 新增: /// </summary> | |
| 89 | 新增: private void HandleTable() | |
| 90 | 新增: { | |
| 91 | 新增: var modelInfos = GetModelInfos(); | |
| 92 | 新增: | |
| 93 | 新增: var modelInfosDb = GetModelInfosForDb(); | |
| 94 | 新增: | |
| 95 | 新增: foreach (var model in modelInfos) | |
| 96 | 新增: { | |
| 97 | 新增: //表名 | |
| 98 | 新增: string tableName = model.TableName; | |
| 99 | 新增: | |
| 100 | 新增: var modelInfoDb = modelInfosDb.Where(m => m.TableName == tableName); | |
| 101 | 新增: //判断表是否存在 | |
| 102 | 新增: if (modelInfoDb.Count() <= 0) | |
| 103 | 新增: { | |
| 104 | 新增: //不存在则重新创建表 | |
| 105 | 新增: string csql = GetCreateTableSQL(model); | |
| 106 | 新增: ExecuteNonQuery(csql); | |
| 107 | 新增: } | |
| 108 | 新增: else | |
| 109 | 新增: { | |
| 110 | 新增: //存在则扫描新字段(*暂时不处理字段的属性变化,只处理新增) | |
| 111 | 新增: | |
| 112 | 新增: //对应的数据库模型信息 | |
| 113 | 新增: var modelDb = modelInfoDb.Single(); | |
| 114 | 新增: //查找差异属性 | |
| 115 | 新增: foreach (var item in model.Properties) | |
| 116 | 新增: { | |
| 117 | 新增: if (modelDb.Properties.Where(m => m.Name == item.Name).Count() <= 0) | |
| 118 | 新增: { | |
| 119 | 新增: string csql = GetCreateColumnSQL(tableName, item); | |
| 120 | 新增: ExecuteNonQuery(csql); | |
| 121 | 新增: } | |
| 122 | 新增: } | |
| 123 | 新增: | |
| 124 | 新增: } | |
| 125 | 新增: | |
| 126 | 新增: } | |
| 127 | 新增: } | |
| 128 | 新增: | |
| 129 | 新增: #region 是否需要处理 | |
| 130 | 新增: private bool IsHandleDb() | |
| 131 | 新增: { | |
| 132 | 新增: string dir = Path.GetDirectoryName(versionFile); | |
| 133 | 新增: if (!Directory.Exists(dir)) | |
| 134 | 新增: { | |
| 135 | 新增: Directory.CreateDirectory(dir); | |
| 136 | 新增: } | |
| 137 | 新增: | |
| 138 | 新增: bool f = File.Exists(versionFile); | |
| 139 | 新增: string appVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); | |
| 140 | 新增: if (f) | |
| 141 | 新增: { | |
| 142 | 新增: //存在版本文件对比是否需要更新 | |
| 143 | 新增: string dbVersion = File.ReadAllText(versionFile); | |
| 144 | 新增: if (dbVersion != appVersion) | |
| 145 | 新增: { | |
| 146 | 新增: //版本不一致需要更新 | |
| 147 | 新增: File.WriteAllText(versionFile, appVersion); | |
| 148 | 新增: return true; | |
| 149 | 新增: } | |
| 150 | 新增: //不需要更新 | |
| 151 | 新增: return false; | |
| 152 | 新增: } | |
| 153 | 新增: | |
| 154 | 新增: File.WriteAllText(versionFile, appVersion); | |
| 155 | 新增: return true; | |
| 156 | 新增: } | |
| 157 | 新增: | |
| 158 | 新增: #endregion | |
| 159 | 新增: | |
| 160 | 新增: #region 生成创建列SQL语句 | |
| 161 | 新增: /// <summary> | |
| 162 | 新增: /// 生成创建列SQL语句 | |
| 163 | 新增: /// </summary> | |
| 164 | 新增: /// <param name="tableName">表名</param> | |
| 165 | 新增: /// <param name="properties">属性</param> | |
| 166 | 新增: /// <returns></returns> | |
| 167 | 新增: private string GetCreateColumnSQL(string tableName, IModelProperties properties) | |
| 168 | 新增: { | |
| 169 | 新增: string typeDefault = properties.NotNull ? properties.Type == "int" ? "NOT NULL DEFAULT 0" : "NOT NULL DEFAULT ''" : ""; | |
| 170 | 新增: return $"ALTER table {tableName} ADD COLUMN [{properties.Name}] {properties.Type} {typeDefault}"; | |
| 171 | 新增: } | |
| 172 | 新增: #endregion | |
| 173 | 新增: | |
| 174 | 新增: #region 生成创建表SQL语句 | |
| 175 | 新增: /// <summary> | |
| 176 | 新增: /// 生成创建表SQL语句 | |
| 177 | 新增: /// </summary> | |
| 178 | 新增: /// <param name="model">模型信息</param> | |
| 179 | 新增: /// <returns></returns> | |
| 180 | 新增: private string GetCreateTableSQL(IModelInfo model) | |
| 181 | 新增: { | |
| 182 | 新增: string sql = $"CREATE TABLE \"{model.TableName}\" ("; | |
| 183 | 新增: foreach (var p in model.Properties) | |
| 184 | 新增: { | |
| 185 | 新增: string add = p.PK ? $"{p.Type} PRIMARY KEY" : p.Type + (p.NotNull ? " NOT NULL" : ""); | |
| 186 | 新增: string addChar = p == model.Properties[0] ? "" : ","; | |
| 187 | 新增: sql += $"{addChar}[{p.Name}] {add}"; | |
| 188 | 新增: } | |
| 189 | 新增: sql += ")"; | |
| 190 | 新增: return sql; | |
| 191 | 新增: } | |
| 192 | 新增: #endregion | |
| 193 | 新增: | |
| 194 | 新增: #region 判断表是否存在数据库中 | |
| 195 | 新增: /// <summary> | |
| 196 | 新增: /// 判断表是否存在数据库中 | |
| 197 | 新增: /// </summary> | |
| 198 | 新增: /// <param name="tableName"></param> | |
| 199 | 新增: /// <returns></returns> | |
| 200 | 新增: private bool IsTableExistDb(string tableName) | |
| 201 | 新增: { | |
| 202 | 新增: using (var con = new SQLiteConnection(@"Data Source=.\data.db")) | |
| 203 | 新增: { | |
| 204 | 新增: con.Open(); | |
| 205 | 新增: using (var cmd = new SQLiteCommand(con)) | |
| 206 | 新增: { | |
| 207 | 新增: cmd.CommandText = "select count(*) from sqlite_master where type='table' and name = 'StatisticModels3'"; | |
| 208 | 新增: var rd = cmd.ExecuteReader(); | |
| 209 | 新增: if (rd.Read()) | |
| 210 | 新增: { | |
| 211 | 新增: var count = rd.GetInt32(0); | |
| 212 | 新增: return count > 0; | |
| 213 | 新增: } | |
| 214 | 新增: return false; | |
| 215 | 新增: } | |
| 216 | 新增: | |
| 217 | 新增: } | |
| 218 | 新增: } | |
| 219 | 新增: | |
| 220 | 新增: #endregion | |
| 221 | 新增: | |
| 222 | 新增: #region 获取所有数据模型的信息(从代码) | |
| 223 | 新增: /// <summary> | |
| 224 | 新增: /// 获取所有数据模型的信息(从代码) | |
| 225 | 新增: /// </summary> | |
| 226 | 新增: /// <returns></returns> | |
| 227 | 新增: private List<IModelInfo> GetModelInfos() | |
| 228 | 新增: { | |
| 229 | 新增: var result = new List<IModelInfo>(); | |
| 230 | 新增: | |
| 231 | 新增: foreach (var model in storeModel.EntityTypes) | |
| 232 | 新增: { | |
| 233 | 新增: var i = new IModelInfo(); | |
| 234 | 新增: var ps = new List<IModelProperties>(); | |
| 235 | 新增: | |
| 236 | 新增: i.Name = model.Name; | |
| 237 | 新增: i.Properties = ps; | |
| 238 | 新增: //属性获取 | |
| 239 | 新增: foreach (var p in model.Properties) | |
| 240 | 新增: { | |
| 241 | 新增: ps.Add(new IModelProperties() | |
| 242 | 新增: { | |
| 243 | 新增: Name = p.Name, | |
| 244 | 新增: PK = p.IsStoreGeneratedIdentity, | |
| 245 | 新增: Type = p.TypeName == "int" && p.IsStoreGeneratedIdentity ? "INTEGER" : p.TypeName | |
| 246 | 新增: }); | |
| 247 | 新增: } | |
| 248 | 新增: result.Add(i); | |
| 249 | 新增: } | |
| 250 | 新增: return result; | |
| 251 | 新增: } | |
| 252 | 新增: #endregion | |
| 253 | 新增: | |
| 254 | 新增: #region 获取所有数据模型的信息(从数据库) | |
| 255 | 新增: /// <summary> | |
| 256 | 新增: /// 获取所有数据模型的信息(从数据库) | |
| 257 | 新增: /// </summary> | |
| 258 | 新增: /// <returns></returns> | |
| 259 | 新增: private List<IModelInfo> GetModelInfosForDb() | |
| 260 | 新增: { | |
| 261 | 新增: var result = new List<IModelInfo>(); | |
| 262 | 新增: | |
| 263 | 新增: using (var con = new SQLiteConnection(connstr)) | |
| 264 | 新增: { | |
| 265 | 新增: con.Open(); | |
| 266 | 新增: using (var cmd = new SQLiteCommand(con)) | |
| 267 | 新增: { | |
| 268 | 新增: cmd.CommandText = "select name from sqlite_master where type='table' order by name"; | |
| 269 | 新增: using (var rd = cmd.ExecuteReader()) | |
| 270 | 新增: { | |
| 271 | 新增: | |
| 272 | 新增: | |
| 273 | 新增: while (rd.Read()) | |
| 274 | 新增: { | |
| 275 | 新增: var modelInfo = new IModelInfo(); | |
| 276 | 新增: modelInfo.Name = rd["name"].ToString().Substring(0, rd["name"].ToString().Length - 1); | |
| 277 | 新增: modelInfo.Properties = GetModelProperties(modelInfo.TableName); | |
| 278 | 新增: result.Add(modelInfo); | |
| 279 | 新增: } | |
| 280 | 新增: } | |
| 281 | 新增: } | |
| 282 | 新增: | |
| 283 | 新增: } | |
| 284 | 新增: | |
| 285 | 新增: return result; | |
| 286 | 新增: } | |
| 287 | 新增: #endregion | |
| 288 | 新增: | |
| 289 | 新增: #region 获取表的所有属性(从数据库) | |
| 290 | 新增: private List<IModelProperties> GetModelProperties(string tableName) | |
| 291 | 新增: { | |
| 292 | 新增: var result = new List<IModelProperties>(); | |
| 293 | 新增: | |
| 294 | 新增: using (var con = new SQLiteConnection(connstr)) | |
| 295 | 新增: { | |
| 296 | 新增: con.Open(); | |
| 297 | 新增: using (var cmd = new SQLiteCommand(con)) | |
| 298 | 新增: { | |
| 299 | 新增: cmd.CommandText = $"PRAGMA table_info([{tableName}])"; | |
| 300 | 新增: using (var rd = cmd.ExecuteReader()) | |
| 301 | 新增: { | |
| 302 | 新增: while (rd.Read()) | |
| 303 | 新增: { | |
| 304 | 新增: var mp = new IModelProperties(); | |
| 305 | 新增: mp.Name = rd["name"].ToString(); | |
| 306 | 新增: mp.Type = rd["type"].ToString(); | |
| 307 | 新增: mp.PK = rd["pk"].ToString() == "1"; | |
| 308 | 新增: result.Add(mp); | |
| 309 | 新增: } | |
| 310 | 新增: } | |
| 311 | 新增: } | |
| 312 | 新增: } | |
| 313 | 新增: return result; | |
| 314 | 新增: } | |
| 315 | 新增: #endregion | |
| 316 | 新增: | |
| 317 | 新增: | |
| 318 | 新增: //sqlite帮助 | |
| 319 | 新增: /// <summary> | |
| 320 | 新增: /// 执行一条sql语句,返回影响行数 | |
| 321 | 新增: /// </summary> | |
| 322 | 新增: /// <param name="sql"></param> | |
| 323 | 新增: /// <returns></returns> | |
| 324 | 新增: private int ExecuteNonQuery(string sql) | |
| 325 | 新增: { | |
| 326 | 新增: using (var con = new SQLiteConnection(connstr)) | |
| 327 | 新增: { | |
| 328 | 新增: con.Open(); | |
| 329 | 新增: using (var cmd = new SQLiteCommand(con)) | |
| 330 | 新增: { | |
| 331 | 新增: cmd.CommandText = sql; | |
| 332 | 新增: return cmd.ExecuteNonQuery(); | |
| 333 | 新增: } | |
| 334 | 新增: | |
| 335 | 新增: } | |
| 336 | 新增: } | |
| 337 | 新增: } | |
| 338 | 新增: | |
| 339 | 新增:} | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,22 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Data.Entity; | |
| 4 | 新增:using System.Data.Entity.Core.Common; | |
| 5 | 新增:using System.Data.SQLite; | |
| 6 | 新增:using System.Data.SQLite.EF6; | |
| 7 | 新增:using System.Linq; | |
| 8 | 新增:using System.Text; | |
| 9 | 新增:using System.Threading.Tasks; | |
| 10 | 新增: | |
| 11 | 新增:namespace Core.Librarys.SQLite | |
| 12 | 新增:{ | |
| 13 | 新增: public class SQLiteConfiguration : DbConfiguration | |
| 14 | 新增: { | |
| 15 | 新增: public SQLiteConfiguration() | |
| 16 | 新增: { | |
| 17 | 新增: SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance); | |
| 18 | 新增: SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance); | |
| 19 | 新增: SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices))); | |
| 20 | 新增: } | |
| 21 | 新增: } | |
| 22 | 新增:} | |
| @@ -0,0 +1,39 @@ | ||
| 1 | 新增:using Core.Models; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Data.Entity; | |
| 5 | 新增:using System.Data.SQLite; | |
| 6 | 新增:using System.Linq; | |
| 7 | 新增:using System.Text; | |
| 8 | 新增:using System.Threading.Tasks; | |
| 9 | 新增: | |
| 10 | 新增:namespace Core.Librarys.SQLite | |
| 11 | 新增:{ | |
| 12 | 新增: public class StatisticContext : DbContext | |
| 13 | 新增: { | |
| 14 | 新增: /// <summary> | |
| 15 | 新增: /// 每日数据 | |
| 16 | 新增: /// </summary> | |
| 17 | 新增: public DbSet<DailyLogModel> DailyLog { get; set; } | |
| 18 | 新增: | |
| 19 | 新增: // public StatisticContext(string n) | |
| 20 | 新增: //: base("StatisticContext") | |
| 21 | 新增: // { | |
| 22 | 新增: // DbConfiguration.SetConfiguration(new SQLiteConfiguration()); | |
| 23 | 新增: // } | |
| 24 | 新增: public StatisticContext() | |
| 25 | 新增: : base(new SQLiteConnection() | |
| 26 | 新增: { | |
| 27 | 新增: ConnectionString = "Data Source=.\\Data\\data.db" | |
| 28 | 新增: }, true) | |
| 29 | 新增: { | |
| 30 | 新增: DbConfiguration.SetConfiguration(new SQLiteConfiguration()); | |
| 31 | 新增: } | |
| 32 | 新增: | |
| 33 | 新增: protected override void OnModelCreating(DbModelBuilder modelBuilder) | |
| 34 | 新增: { | |
| 35 | 新增: var model = modelBuilder.Build(Database.Connection); | |
| 36 | 新增: new SQLiteBuilder(model).Handle(); | |
| 37 | 新增: } | |
| 38 | 新增: } | |
| 39 | 新增:} | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,76 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.IO; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Reflection; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增: | |
| 9 | 新增:namespace Core.Librarys | |
| 10 | 新增:{ | |
| 11 | 新增: public class Shortcut | |
| 12 | 新增: { | |
| 13 | 新增: /// <summary> | |
| 14 | 新增: /// 为本程序创建一个快捷方式。 | |
| 15 | 新增: /// </summary> | |
| 16 | 新增: /// <param name="lnkFilePath">快捷方式的完全限定路径。</param> | |
| 17 | 新增: /// <param name="args">快捷方式启动程序时需要使用的参数。</param> | |
| 18 | 新增: private static bool CreateShortcut(string lnkFilePath, string args) | |
| 19 | 新增: { | |
| 20 | 新增: try | |
| 21 | 新增: { | |
| 22 | 新增: var shellType = Type.GetTypeFromProgID("WScript.Shell"); | |
| 23 | 新增: dynamic shell = Activator.CreateInstance(shellType); | |
| 24 | 新增: var shortcut = shell.CreateShortcut(lnkFilePath); | |
| 25 | 新增: shortcut.TargetPath = Assembly.GetEntryAssembly().Location; | |
| 26 | 新增: shortcut.Arguments = args; | |
| 27 | 新增: shortcut.WorkingDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; | |
| 28 | 新增: shortcut.Save(); | |
| 29 | 新增: return true; | |
| 30 | 新增: } | |
| 31 | 新增: catch (Exception e) | |
| 32 | 新增: { | |
| 33 | 新增: Logger.Error(e.ToString()); | |
| 34 | 新增: return false; | |
| 35 | 新增: } | |
| 36 | 新增: } | |
| 37 | 新增: /// <summary> | |
| 38 | 新增: /// 设置开机启动 | |
| 39 | 新增: /// </summary> | |
| 40 | 新增: /// <param name="startup"></param> | |
| 41 | 新增: /// <returns></returns> | |
| 42 | 新增: public static bool SetStartup(bool startup = true) | |
| 43 | 新增: { | |
| 44 | 新增: string path = Path.Combine( | |
| 45 | 新增: Environment.GetFolderPath(Environment.SpecialFolder.Startup), | |
| 46 | 新增: "Tai.lnk"); | |
| 47 | 新增: if (startup) | |
| 48 | 新增: { | |
| 49 | 新增: if (File.Exists(path)) | |
| 50 | 新增: { | |
| 51 | 新增: return true; | |
| 52 | 新增: } | |
| 53 | 新增: return CreateShortcut(path, ""); | |
| 54 | 新增: } | |
| 55 | 新增: else | |
| 56 | 新增: { | |
| 57 | 新增: if (File.Exists(path)) | |
| 58 | 新增: { | |
| 59 | 新增: File.Delete(path); | |
| 60 | 新增: } | |
| 61 | 新增: return true; | |
| 62 | 新增: } | |
| 63 | 新增: } | |
| 64 | 新增: /// <summary> | |
| 65 | 新增: /// 创建桌面快捷方式 | |
| 66 | 新增: /// </summary> | |
| 67 | 新增: /// <param name="create"></param> | |
| 68 | 新增: /// <returns></returns> | |
| 69 | 新增: public static bool CreateDesktopShortcut() | |
| 70 | 新增: { | |
| 71 | 新增: return CreateShortcut(Path.Combine( | |
| 72 | 新增: Environment.GetFolderPath(Environment.SpecialFolder.Desktop), | |
| 73 | 新增: "Tai.lnk"), ""); | |
| 74 | 新增: } | |
| 75 | 新增: } | |
| 76 | 新增:} | |
| @@ -4,6 +4,7 @@ using System.Linq; | ||
| 4 | 4 | using System.Runtime.InteropServices; |
| 5 | 5 | using System.Text; |
| 6 | 6 | using System.Threading.Tasks; |
| 7 | 新增:using System.Windows; | |
| 7 | 8 | |
| 8 | 9 | namespace Core.Librarys |
| 9 | 10 | { |
| @@ -21,5 +22,173 @@ namespace Core.Librarys | ||
| 21 | 22 | |
| 22 | 23 | [DllImport("user32.dll", CharSet = CharSet.Auto)] |
| 23 | 24 | public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); |
| 25 | 新增: | |
| 26 | 新增: [DllImport("psapi.dll", SetLastError = true)] | |
| 27 | 新增: public static extern int GetModuleFileNameExA(IntPtr hProcess, IntPtr hModule, StringBuilder lpFilename, int nSize); | |
| 28 | 新增: | |
| 29 | 新增: [DllImport("kernel32.dll", SetLastError = true)] | |
| 30 | 新增: public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId); | |
| 31 | 新增: | |
| 32 | 新增: [DllImport("kernel32.dll", SetLastError = true)] | |
| 33 | 新增: public static extern bool CloseHandle(UIntPtr hObject); | |
| 34 | 新增: | |
| 35 | 新增: | |
| 36 | 新增: | |
| 37 | 新增: internal struct WINDOWINFO | |
| 38 | 新增: { | |
| 39 | 新增: public uint ownerpid; | |
| 40 | 新增: public uint childpid; | |
| 41 | 新增: } | |
| 42 | 新增: | |
| 43 | 新增: [DllImport("user32.dll", SetLastError = true)] | |
| 44 | 新增: public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); | |
| 45 | 新增: | |
| 46 | 新增: [DllImport("user32", SetLastError = true)] | |
| 47 | 新增: [return: MarshalAs(UnmanagedType.Bool)] | |
| 48 | 新增: public static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowProc lpEnumFunc, IntPtr lParam); | |
| 49 | 新增: | |
| 50 | 新增: | |
| 51 | 新增: | |
| 52 | 新增: [DllImport("kernel32.dll", SetLastError = true)] | |
| 53 | 新增: public static extern bool QueryFullProcessImageName([In] IntPtr hProcess, [In] int dwFlags, [Out] StringBuilder lpExeName, ref int lpdwSize); | |
| 54 | 新增: | |
| 55 | 新增: | |
| 56 | 新增: public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter); | |
| 57 | 新增: | |
| 58 | 新增: public const UInt32 PROCESS_QUERY_INFORMATION = 0x400; | |
| 59 | 新增: public const UInt32 PROCESS_VM_READ = 0x010; | |
| 60 | 新增: | |
| 61 | 新增: private const uint WINEVENT_OUTOFCONTEXT = 0; | |
| 62 | 新增: private const uint EVENT_SYSTEM_FOREGROUND = 3; | |
| 63 | 新增: public static string UWP_AppName(IntPtr hWnd, uint pID) | |
| 64 | 新增: { | |
| 65 | 新增: WINDOWINFO windowinfo = new WINDOWINFO(); | |
| 66 | 新增: windowinfo.ownerpid = pID; | |
| 67 | 新增: windowinfo.childpid = windowinfo.ownerpid; | |
| 68 | 新增: | |
| 69 | 新增: IntPtr pWindowinfo = Marshal.AllocHGlobal(Marshal.SizeOf(windowinfo)); | |
| 70 | 新增: | |
| 71 | 新增: Marshal.StructureToPtr(windowinfo, pWindowinfo, false); | |
| 72 | 新增: | |
| 73 | 新增: EnumWindowProc lpEnumFunc = new EnumWindowProc(EnumChildWindowsCallback); | |
| 74 | 新增: EnumChildWindows(hWnd, lpEnumFunc, pWindowinfo); | |
| 75 | 新增: | |
| 76 | 新增: windowinfo = (WINDOWINFO)Marshal.PtrToStructure(pWindowinfo, typeof(WINDOWINFO)); | |
| 77 | 新增: | |
| 78 | 新增: IntPtr proc; | |
| 79 | 新增: if ((proc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, (int)windowinfo.childpid)) == IntPtr.Zero) return null; | |
| 80 | 新增: | |
| 81 | 新增: int capacity = 2000; | |
| 82 | 新增: StringBuilder sb = new StringBuilder(capacity); | |
| 83 | 新增: QueryFullProcessImageName(proc, 0, sb, ref capacity); | |
| 84 | 新增: | |
| 85 | 新增: Marshal.FreeHGlobal(pWindowinfo); | |
| 86 | 新增: | |
| 87 | 新增: return sb.ToString(0, capacity); | |
| 88 | 新增: } | |
| 89 | 新增: | |
| 90 | 新增: private static bool EnumChildWindowsCallback(IntPtr hWnd, IntPtr lParam) | |
| 91 | 新增: { | |
| 92 | 新增: WINDOWINFO info = (WINDOWINFO)Marshal.PtrToStructure(lParam, typeof(WINDOWINFO)); | |
| 93 | 新增: | |
| 94 | 新增: uint pID; | |
| 95 | 新增: GetWindowThreadProcessId(hWnd, out pID); | |
| 96 | 新增: | |
| 97 | 新增: if (pID != info.ownerpid) info.childpid = pID; | |
| 98 | 新增: | |
| 99 | 新增: Marshal.StructureToPtr(info, lParam, true); | |
| 100 | 新增: | |
| 101 | 新增: return true; | |
| 102 | 新增: } | |
| 103 | 新增: | |
| 104 | 新增: | |
| 105 | 新增: /// <summary> | |
| 106 | 新增: /// 获取鼠标坐标 | |
| 107 | 新增: /// </summary> | |
| 108 | 新增: /// <param name="lpPoint"></param> | |
| 109 | 新增: /// <returns></returns> | |
| 110 | 新增: [DllImport("user32.dll", SetLastError = true)] | |
| 111 | 新增: [return: MarshalAs(UnmanagedType.Bool)] | |
| 112 | 新增: public static extern bool GetCursorPos(out Point lpPoint); | |
| 113 | 新增: | |
| 114 | 新增: | |
| 115 | 新增: #region 声音判断 | |
| 116 | 新增: /// <summary> | |
| 117 | 新增: /// 指示系统当前是否在播放声音 | |
| 118 | 新增: /// </summary> | |
| 119 | 新增: /// <returns></returns> | |
| 120 | 新增: public static bool IsWindowsPlayingSound() | |
| 121 | 新增: { | |
| 122 | 新增: try | |
| 123 | 新增: { | |
| 124 | 新增: IMMDeviceEnumerator enumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); | |
| 125 | 新增: IMMDevice speakers = enumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia); | |
| 126 | 新增: IAudioMeterInformation meter = (IAudioMeterInformation)speakers.Activate(typeof(IAudioMeterInformation).GUID, 0, IntPtr.Zero); | |
| 127 | 新增: if (meter != null) | |
| 128 | 新增: { | |
| 129 | 新增: | |
| 130 | 新增: float value = meter.GetPeakValue(); | |
| 131 | 新增: | |
| 132 | 新增: // this is a bit tricky. 0 is the official "no sound" value | |
| 133 | 新增: // but for example, if you open a video and plays/stops with it (w/o killing the app/window/stream), | |
| 134 | 新增: // the value will not be zero, but something really small (around 1E-09) | |
| 135 | 新增: // so, depending on your context, it is up to you to decide | |
| 136 | 新增: // if you want to test for 0 or for a small value | |
| 137 | 新增: return value > 1E-08; | |
| 138 | 新增: } | |
| 139 | 新增: else | |
| 140 | 新增: { | |
| 141 | 新增: return false; | |
| 142 | 新增: } | |
| 143 | 新增: } | |
| 144 | 新增: catch (Exception ec) | |
| 145 | 新增: { | |
| 146 | 新增: Logger.Error(ec.Message); | |
| 147 | 新增: return false; | |
| 148 | 新增: } | |
| 149 | 新增: } | |
| 150 | 新增: | |
| 151 | 新增: [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] | |
| 152 | 新增: private class MMDeviceEnumerator | |
| 153 | 新增: { | |
| 154 | 新增: } | |
| 155 | 新增: | |
| 156 | 新增: private enum EDataFlow | |
| 157 | 新增: { | |
| 158 | 新增: eRender, | |
| 159 | 新增: eCapture, | |
| 160 | 新增: eAll, | |
| 161 | 新增: } | |
| 162 | 新增: | |
| 163 | 新增: private enum ERole | |
| 164 | 新增: { | |
| 165 | 新增: eConsole, | |
| 166 | 新增: eMultimedia, | |
| 167 | 新增: eCommunications, | |
| 168 | 新增: } | |
| 169 | 新增: | |
| 170 | 新增: [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")] | |
| 171 | 新增: private interface IMMDeviceEnumerator | |
| 172 | 新增: { | |
| 173 | 新增: void NotNeeded(); | |
| 174 | 新增: IMMDevice GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role); | |
| 175 | 新增: // the rest is not defined/needed | |
| 176 | 新增: } | |
| 177 | 新增: | |
| 178 | 新增: [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("D666063F-1587-4E43-81F1-B948E807363F")] | |
| 179 | 新增: private interface IMMDevice | |
| 180 | 新增: { | |
| 181 | 新增: [return: MarshalAs(UnmanagedType.IUnknown)] | |
| 182 | 新增: object Activate([MarshalAs(UnmanagedType.LPStruct)] Guid iid, int dwClsCtx, IntPtr pActivationParams); | |
| 183 | 新增: // the rest is not defined/needed | |
| 184 | 新增: } | |
| 185 | 新增: | |
| 186 | 新增: [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("C02216F6-8C67-4B5B-9D00-D008E73E0064")] | |
| 187 | 新增: private interface IAudioMeterInformation | |
| 188 | 新增: { | |
| 189 | 新增: float GetPeakValue(); | |
| 190 | 新增: // the rest is not defined/needed | |
| 191 | 新增: } | |
| 192 | 新增: #endregion | |
| 24 | 193 | } |
| 25 | 194 | } |
| @@ -0,0 +1,34 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Core.Models.Config | |
| 8 | 新增:{ | |
| 9 | 新增: [AttributeUsage(AttributeTargets.Class | | |
| 10 | 新增: AttributeTargets.Constructor | | |
| 11 | 新增: AttributeTargets.Field | | |
| 12 | 新增: AttributeTargets.Method | | |
| 13 | 新增: AttributeTargets.Property)] | |
| 14 | 新增: | |
| 15 | 新增: public class ConfigAttribute : System.Attribute | |
| 16 | 新增: { | |
| 17 | 新增: public string Name; | |
| 18 | 新增: public string Description; | |
| 19 | 新增: public string ToggleTrueText; | |
| 20 | 新增: public string ToggleFalseText; | |
| 21 | 新增: public string Group; | |
| 22 | 新增: public int Index; | |
| 23 | 新增: public bool IsName; | |
| 24 | 新增: public ConfigAttribute() | |
| 25 | 新增: { | |
| 26 | 新增: ToggleTrueText = "开"; | |
| 27 | 新增: ToggleFalseText = "关"; | |
| 28 | 新增: Index = 0; | |
| 29 | 新增: IsName = false; | |
| 30 | 新增: } | |
| 31 | 新增: | |
| 32 | 新增: | |
| 33 | 新增: } | |
| 34 | 新增:} | |
| @@ -0,0 +1,25 @@ | ||
| 1 | 新增:using Core.Models.Config.Link; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Text; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增: | |
| 8 | 新增:namespace Core.Models.Config | |
| 9 | 新增:{ | |
| 10 | 新增: /// <summary> | |
| 11 | 新增: /// 应用设置 | |
| 12 | 新增: /// </summary> | |
| 13 | 新增: public class ConfigModel | |
| 14 | 新增: { | |
| 15 | 新增: /// <summary> | |
| 16 | 新增: /// 关联进程 | |
| 17 | 新增: /// </summary> | |
| 18 | 新增: public List<LinkModel> Links { get; set; } | |
| 19 | 新增: | |
| 20 | 新增: /// <summary> | |
| 21 | 新增: /// 常规 | |
| 22 | 新增: /// </summary> | |
| 23 | 新增: public GeneralModel General { get; set; } | |
| 24 | 新增: } | |
| 25 | 新增:} | |
| @@ -0,0 +1,20 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Core.Models.Config | |
| 8 | 新增:{ | |
| 9 | 新增: /// <summary> | |
| 10 | 新增: /// 常规 | |
| 11 | 新增: /// </summary> | |
| 12 | 新增: public class GeneralModel | |
| 13 | 新增: { | |
| 14 | 新增: [Config(Name = "开机自启动", Description = "在电脑启动时自动运行 Tai", Group = "基础")] | |
| 15 | 新增: /// <summary> | |
| 16 | 新增: /// 是否启用开机自启动 | |
| 17 | 新增: /// </summary> | |
| 18 | 新增: public bool IsStartatboot { get; set; } | |
| 19 | 新增: } | |
| 20 | 新增:} | |
| @@ -0,0 +1,22 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Core.Models.Config.Link | |
| 8 | 新增:{ | |
| 9 | 新增: public class LinkModel | |
| 10 | 新增: { | |
| 11 | 新增: /// <summary> | |
| 12 | 新增: /// 关联名称 | |
| 13 | 新增: /// </summary> | |
| 14 | 新增: [Config(Name = "关联名称", Description = "设置一个名称用于识别该关联的目的", IsName = true)] | |
| 15 | 新增: public string Name { get; set; } = "新的关联"; | |
| 16 | 新增: /// <summary> | |
| 17 | 新增: /// 关联进程列表 | |
| 18 | 新增: /// </summary> | |
| 19 | 新增: [Config(Name = "关联进程", Description = "将需要关联的进程名称(不带.exe)添加到此")] | |
| 20 | 新增: public List<string> ProcessList { get; set; } = new List<string>(); | |
| 21 | 新增: } | |
| 22 | 新增:} | |
| @@ -0,0 +1,36 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Core.Models | |
| 8 | 新增:{ | |
| 9 | 新增: /// <summary> | |
| 10 | 新增: /// 每日使用数据 | |
| 11 | 新增: /// </summary> | |
| 12 | 新增: public class DailyLogModel | |
| 13 | 新增: { | |
| 14 | 新增: public int ID { get; set; } | |
| 15 | 新增: /// <summary> | |
| 16 | 新增: /// 统计日期 | |
| 17 | 新增: /// </summary> | |
| 18 | 新增: public DateTime Date { get; set; } | |
| 19 | 新增: /// <summary> | |
| 20 | 新增: /// 使用时长(单位:秒) | |
| 21 | 新增: /// </summary> | |
| 22 | 新增: public int Time { get; set; } = 0; | |
| 23 | 新增: /// <summary> | |
| 24 | 新增: /// 进程名称 | |
| 25 | 新增: /// </summary> | |
| 26 | 新增: public string ProcessName { get; set; } | |
| 27 | 新增: /// <summary> | |
| 28 | 新增: /// 进程描述 | |
| 29 | 新增: /// </summary> | |
| 30 | 新增: public string ProcessDescription { get; set; } | |
| 31 | 新增: /// <summary> | |
| 32 | 新增: /// 进程文件 | |
| 33 | 新增: /// </summary> | |
| 34 | 新增: public string File { get; set; } | |
| 35 | 新增: } | |
| 36 | 新增:} | |
| @@ -0,0 +1,115 @@ | ||
| 1 | 新增:using Core.Event; | |
| 2 | 新增:using Core.Librarys; | |
| 3 | 新增:using Core.Models.Config; | |
| 4 | 新增:using Core.Servicers.Interfaces; | |
| 5 | 新增:using Newtonsoft.Json; | |
| 6 | 新增:using System; | |
| 7 | 新增:using System.Collections.Generic; | |
| 8 | 新增:using System.IO; | |
| 9 | 新增:using System.Linq; | |
| 10 | 新增:using System.Text; | |
| 11 | 新增:using System.Threading.Tasks; | |
| 12 | 新增: | |
| 13 | 新增:namespace Core.Servicers.Instances | |
| 14 | 新增:{ | |
| 15 | 新增: public class AppConfig : IAppConfig | |
| 16 | 新增: { | |
| 17 | 新增: private string fileName; | |
| 18 | 新增: private ConfigModel config; | |
| 19 | 新增: | |
| 20 | 新增: public event AppConfigEventHandler ConfigChanged; | |
| 21 | 新增: private ConfigModel oldConfig; | |
| 22 | 新增: | |
| 23 | 新增: public AppConfig() | |
| 24 | 新增: { | |
| 25 | 新增: fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, | |
| 26 | 新增: "Data", | |
| 27 | 新增: "AppConfig.json"); | |
| 28 | 新增: } | |
| 29 | 新增: public void Load() | |
| 30 | 新增: { | |
| 31 | 新增: string configText = string.Empty; | |
| 32 | 新增: try | |
| 33 | 新增: { | |
| 34 | 新增: if (File.Exists(fileName)) | |
| 35 | 新增: { | |
| 36 | 新增: configText = File.ReadAllText(fileName); | |
| 37 | 新增: config = JsonConvert.DeserializeObject<ConfigModel>(configText); | |
| 38 | 新增: } | |
| 39 | 新增: else | |
| 40 | 新增: { | |
| 41 | 新增: // 创建基础配置 | |
| 42 | 新增: CreateDefaultConfig(); | |
| 43 | 新增: | |
| 44 | 新增: Save(); | |
| 45 | 新增: } | |
| 46 | 新增: | |
| 47 | 新增: CopyToOldConfig(); | |
| 48 | 新增: } | |
| 49 | 新增: catch (JsonSerializationException ex) | |
| 50 | 新增: { | |
| 51 | 新增: HandleLoadFail(ex.Message, configText); | |
| 52 | 新增: } | |
| 53 | 新增: catch (JsonReaderException ex) | |
| 54 | 新增: { | |
| 55 | 新增: HandleLoadFail(ex.Message, configText); | |
| 56 | 新增: } | |
| 57 | 新增: catch (Exception ex) | |
| 58 | 新增: { | |
| 59 | 新增: Logger.Error(ex.Message); | |
| 60 | 新增: } | |
| 61 | 新增: } | |
| 62 | 新增: | |
| 63 | 新增: private void CopyToOldConfig() | |
| 64 | 新增: { | |
| 65 | 新增: string configStr = JsonConvert.SerializeObject(config); | |
| 66 | 新增: oldConfig = JsonConvert.DeserializeObject<ConfigModel>(configStr); | |
| 67 | 新增: } | |
| 68 | 新增: | |
| 69 | 新增: private void HandleLoadFail(string err, string configText) | |
| 70 | 新增: { | |
| 71 | 新增: // 创建基础配置 | |
| 72 | 新增: CreateDefaultConfig(); | |
| 73 | 新增: | |
| 74 | 新增: Save(); | |
| 75 | 新增: | |
| 76 | 新增: Logger.Error(err + "\r\nConfig content: " + configText); | |
| 77 | 新增: } | |
| 78 | 新增: private void CreateDefaultConfig() | |
| 79 | 新增: { | |
| 80 | 新增: config = new ConfigModel(); | |
| 81 | 新增: config.Links = new List<Models.Config.Link.LinkModel>(); | |
| 82 | 新增: | |
| 83 | 新增: config.General = new GeneralModel(); | |
| 84 | 新增: config.General.IsStartatboot = false; | |
| 85 | 新增: } | |
| 86 | 新增: | |
| 87 | 新增: public ConfigModel GetConfig() | |
| 88 | 新增: { | |
| 89 | 新增: return config; | |
| 90 | 新增: } | |
| 91 | 新增: | |
| 92 | 新增: | |
| 93 | 新增: public void Save() | |
| 94 | 新增: { | |
| 95 | 新增: try | |
| 96 | 新增: { | |
| 97 | 新增: string dir = Path.GetDirectoryName(fileName); | |
| 98 | 新增: if (!Directory.Exists(dir)) | |
| 99 | 新增: { | |
| 100 | 新增: Directory.CreateDirectory(dir); | |
| 101 | 新增: } | |
| 102 | 新增: | |
| 103 | 新增: File.WriteAllText(fileName, JsonConvert.SerializeObject(config)); | |
| 104 | 新增: | |
| 105 | 新增: ConfigChanged?.Invoke(oldConfig, config); | |
| 106 | 新增: | |
| 107 | 新增: CopyToOldConfig(); | |
| 108 | 新增: } | |
| 109 | 新增: catch (Exception ex) | |
| 110 | 新增: { | |
| 111 | 新增: Logger.Error(ex.Message); | |
| 112 | 新增: } | |
| 113 | 新增: } | |
| 114 | 新增: } | |
| 115 | 新增:} | |
| @@ -0,0 +1,164 @@ | ||
| 1 | 新增:using Core.Librarys.SQLite; | |
| 2 | 新增:using Core.Models; | |
| 3 | 新增:using Core.Servicers.Interfaces; | |
| 4 | 新增:using System; | |
| 5 | 新增:using System.Collections.Generic; | |
| 6 | 新增:using System.Linq; | |
| 7 | 新增:using System.Text; | |
| 8 | 新增:using System.Threading.Tasks; | |
| 9 | 新增: | |
| 10 | 新增:namespace Core.Servicers.Instances | |
| 11 | 新增:{ | |
| 12 | 新增: public class Data : IData | |
| 13 | 新增: { | |
| 14 | 新增: | |
| 15 | 新增: public void Set(string processName, string processDescription, string file, int seconds) | |
| 16 | 新增: { | |
| 17 | 新增: if (string.IsNullOrEmpty(processName) || string.IsNullOrEmpty(file) || seconds <= 0) | |
| 18 | 新增: { | |
| 19 | 新增: return; | |
| 20 | 新增: } | |
| 21 | 新增: processDescription = processDescription == null ? string.Empty : processDescription; | |
| 22 | 新增: using (var db = new StatisticContext()) | |
| 23 | 新增: { | |
| 24 | 新增: var today = DateTime.Now.Date; | |
| 25 | 新增: var res = db.DailyLog.SingleOrDefault(m => m.Date == today && m.ProcessName == processName && m.ProcessDescription == processDescription && m.File == file); | |
| 26 | 新增: if (res == null) | |
| 27 | 新增: { | |
| 28 | 新增: //数据库中没有时则创建 | |
| 29 | 新增: db.DailyLog.Add(new Models.DailyLogModel() | |
| 30 | 新增: { | |
| 31 | 新增: Date = today, | |
| 32 | 新增: File = file, | |
| 33 | 新增: ProcessDescription = processDescription, | |
| 34 | 新增: ProcessName = processName, | |
| 35 | 新增: Time = seconds, | |
| 36 | 新增: }); | |
| 37 | 新增: } | |
| 38 | 新增: else | |
| 39 | 新增: { | |
| 40 | 新增: res.Time += seconds; | |
| 41 | 新增: } | |
| 42 | 新增: db.SaveChanges(); | |
| 43 | 新增: } | |
| 44 | 新增: } | |
| 45 | 新增: | |
| 46 | 新增: public List<DailyLogModel> GetTodaylogList() | |
| 47 | 新增: { | |
| 48 | 新增: using (var db = new StatisticContext()) | |
| 49 | 新增: { | |
| 50 | 新增: var today = DateTime.Now.Date; | |
| 51 | 新增: var res = db.DailyLog.Where(m => m.Date == today); | |
| 52 | 新增: return res.ToList(); | |
| 53 | 新增: } | |
| 54 | 新增: } | |
| 55 | 新增: | |
| 56 | 新增: public List<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end) | |
| 57 | 新增: { | |
| 58 | 新增: | |
| 59 | 新增: using (var db = new StatisticContext()) | |
| 60 | 新增: { | |
| 61 | 新增: var today = DateTime.Now.Date; | |
| 62 | 新增: var res = db.DailyLog.SqlQuery("Select Sum(Time) as Time,ProcessName,File,ID,Date,ProcessDescription from DailyLogModels WHERE Date between '" + start.ToString("yyyy-MM-dd HH:mm:ss") + "' AND '" + end.ToString("yyyy-MM-dd HH:mm:ss") + "' GROUP BY ProcessName,File ").ToList(); | |
| 63 | 新增: return res.ToList(); | |
| 64 | 新增: } | |
| 65 | 新增: } | |
| 66 | 新增: | |
| 67 | 新增: public List<DailyLogModel> GetThisWeeklogList() | |
| 68 | 新增: { | |
| 69 | 新增: DateTime weekStartDate = DateTime.Now, weekEndDate = DateTime.Now; | |
| 70 | 新增: if (DateTime.Now.DayOfWeek == DayOfWeek.Monday) | |
| 71 | 新增: { | |
| 72 | 新增: weekStartDate = DateTime.Now.Date; | |
| 73 | 新增: weekEndDate = DateTime.Now.Date.AddDays(6); | |
| 74 | 新增: } | |
| 75 | 新增: else | |
| 76 | 新增: { | |
| 77 | 新增: int weekNum = (int)DateTime.Now.DayOfWeek; | |
| 78 | 新增: if (weekNum == 0) | |
| 79 | 新增: { | |
| 80 | 新增: weekNum = 7; | |
| 81 | 新增: } | |
| 82 | 新增: weekNum -= 1; | |
| 83 | 新增: weekStartDate = DateTime.Now.Date.AddDays(-weekNum); | |
| 84 | 新增: weekEndDate = weekStartDate.Date.AddDays(6); | |
| 85 | 新增: } | |
| 86 | 新增: | |
| 87 | 新增: return GetDateRangelogList(weekStartDate, weekEndDate); | |
| 88 | 新增: } | |
| 89 | 新增: | |
| 90 | 新增: public List<DailyLogModel> GetLastWeeklogList() | |
| 91 | 新增: { | |
| 92 | 新增: DateTime weekStartDate = DateTime.Now, weekEndDate = DateTime.Now; | |
| 93 | 新增: | |
| 94 | 新增: int weekNum = (int)DateTime.Now.DayOfWeek; | |
| 95 | 新增: if (weekNum == 0) | |
| 96 | 新增: { | |
| 97 | 新增: weekNum = 7; | |
| 98 | 新增: } | |
| 99 | 新增: | |
| 100 | 新增: | |
| 101 | 新增: weekStartDate = DateTime.Now.Date.AddDays(-6 - weekNum); | |
| 102 | 新增: weekEndDate = weekStartDate.AddDays(6); | |
| 103 | 新增: | |
| 104 | 新增: return GetDateRangelogList(weekStartDate, weekEndDate); | |
| 105 | 新增: } | |
| 106 | 新增: | |
| 107 | 新增: public void Set(string processName, int seconds) | |
| 108 | 新增: { | |
| 109 | 新增: if (string.IsNullOrEmpty(processName) || seconds <= 0) | |
| 110 | 新增: { | |
| 111 | 新增: return; | |
| 112 | 新增: } | |
| 113 | 新增: using (var db = new StatisticContext()) | |
| 114 | 新增: { | |
| 115 | 新增: var today = DateTime.Now.Date; | |
| 116 | 新增: var res = db.DailyLog.SingleOrDefault(m => m.Date == today && m.ProcessName == processName); | |
| 117 | 新增: if (res != null) | |
| 118 | 新增: { | |
| 119 | 新增: res.Time += seconds; | |
| 120 | 新增: db.SaveChanges(); | |
| 121 | 新增: } | |
| 122 | 新增: | |
| 123 | 新增: } | |
| 124 | 新增: } | |
| 125 | 新增: | |
| 126 | 新增: public List<DailyLogModel> GetProcessMonthLogList(string file, DateTime month) | |
| 127 | 新增: { | |
| 128 | 新增: using (var db = new StatisticContext()) | |
| 129 | 新增: { | |
| 130 | 新增: | |
| 131 | 新增: var res = db.DailyLog.Where( | |
| 132 | 新增: m => | |
| 133 | 新增: m.Date.Year == month.Year | |
| 134 | 新增: && m.Date.Month == month.Month | |
| 135 | 新增: //&& m.ProcessName == processName | |
| 136 | 新增: //&& m.ProcessDescription == processDescription | |
| 137 | 新增: && m.File == file | |
| 138 | 新增: ); | |
| 139 | 新增: if (res != null) | |
| 140 | 新增: { | |
| 141 | 新增: return res.ToList(); | |
| 142 | 新增: } | |
| 143 | 新增: return new List<DailyLogModel>(); | |
| 144 | 新增: } | |
| 145 | 新增: } | |
| 146 | 新增: | |
| 147 | 新增: public DailyLogModel GetLast(string file) | |
| 148 | 新增: { | |
| 149 | 新增: using (var db = new StatisticContext()) | |
| 150 | 新增: { | |
| 151 | 新增: | |
| 152 | 新增: var res = db.DailyLog.Where( | |
| 153 | 新增: m => | |
| 154 | 新增: m.File == file | |
| 155 | 新增: ).OrderByDescending(m => m.ID).Take(1); | |
| 156 | 新增: if (res != null) | |
| 157 | 新增: { | |
| 158 | 新增: return res.FirstOrDefault(); | |
| 159 | 新增: } | |
| 160 | 新增: return null; | |
| 161 | 新增: } | |
| 162 | 新增: } | |
| 163 | 新增: } | |
| 164 | 新增:} | |
| @@ -0,0 +1,57 @@ | ||
| 1 | 新增:using Core.Servicers.Interfaces; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Text; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增:using System.Windows.Threading; | |
| 8 | 新增: | |
| 9 | 新增:namespace Core.Servicers.Instances | |
| 10 | 新增:{ | |
| 11 | 新增: public class DateObserver : IDateObserver | |
| 12 | 新增: { | |
| 13 | 新增: public event EventHandler OnDateChanging; | |
| 14 | 新增: | |
| 15 | 新增: | |
| 16 | 新增: | |
| 17 | 新增: private DispatcherTimer timer; | |
| 18 | 新增: | |
| 19 | 新增: public DateObserver() | |
| 20 | 新增: { | |
| 21 | 新增: } | |
| 22 | 新增: | |
| 23 | 新增: | |
| 24 | 新增: public void Start() | |
| 25 | 新增: { | |
| 26 | 新增: SetTimer(); | |
| 27 | 新增: } | |
| 28 | 新增: | |
| 29 | 新增: private void SetTimer() | |
| 30 | 新增: { | |
| 31 | 新增: timer = new DispatcherTimer(); | |
| 32 | 新增: timer.Tick += Timer_Tick; | |
| 33 | 新增: DateTime now = DateTime.Now; | |
| 34 | 新增: DateTime tmorrow = new DateTime(now.Year, now.Month, now.Day, 23, 59, 30); | |
| 35 | 新增: int diffseconds = (int)tmorrow.Subtract(now).TotalSeconds; | |
| 36 | 新增: if (diffseconds < 0) | |
| 37 | 新增: { | |
| 38 | 新增: diffseconds = 0; | |
| 39 | 新增: } | |
| 40 | 新增: timer.Interval = new TimeSpan(0, 0, diffseconds); | |
| 41 | 新增: timer.Start(); | |
| 42 | 新增: } | |
| 43 | 新增: | |
| 44 | 新增: private async void Timer_Tick(object sender, EventArgs e) | |
| 45 | 新增: { | |
| 46 | 新增: timer.Stop(); | |
| 47 | 新增: | |
| 48 | 新增: OnDateChanging?.Invoke(this, EventArgs.Empty); | |
| 49 | 新增: | |
| 50 | 新增: await Task.Run(async () => | |
| 51 | 新增: { | |
| 52 | 新增: await Task.Delay(60000); | |
| 53 | 新增: SetTimer(); | |
| 54 | 新增: }); | |
| 55 | 新增: } | |
| 56 | 新增: } | |
| 57 | 新增:} | |
| @@ -1,6 +1,13 @@ | ||
| 1 | 删除:using Core.Servicers.Interfaces; | |
| 1 | 新增:using Core.Enums; | |
| 2 | 新增:using Core.Librarys; | |
| 3 | 新增:using Core.Librarys.SQLite; | |
| 4 | 新增:using Core.Models.Config; | |
| 5 | 新增:using Core.Models.Config.Link; | |
| 6 | 新增:using Core.Servicers.Interfaces; | |
| 2 | 7 | using System; |
| 3 | 8 | using System.Collections.Generic; |
| 9 | 新增:using System.Data.Entity; | |
| 10 | 新增:using System.Diagnostics; | |
| 4 | 11 | using System.Linq; |
| 5 | 12 | using System.Text; |
| 6 | 13 | using System.Threading.Tasks; |
| @@ -10,18 +17,218 @@ namespace Core.Servicers.Instances | ||
| 10 | 17 | public class Main : IMain |
| 11 | 18 | { |
| 12 | 19 | private readonly IObserver observer; |
| 13 | 删除: public Main(IObserver observer) | |
| 20 | 新增: private readonly IData data; | |
| 21 | 新增: private readonly ISleepdiscover sleepdiscover; | |
| 22 | 新增: private readonly IAppConfig appConfig; | |
| 23 | 新增: private readonly IDateObserver dateObserver; | |
| 24 | 新增: // 忽略的进程 | |
| 25 | 新增: private readonly string[] IgnoreProcess = new string[] { | |
| 26 | 新增: "Tai", | |
| 27 | 新增: "SearchHost", | |
| 28 | 新增: "Taskmgr", | |
| 29 | 新增: "ApplicationFrameHost", | |
| 30 | 新增: "StartMenuExperienceHost", | |
| 31 | 新增: "ShellExperienceHost", | |
| 32 | 新增: "OpenWith" | |
| 33 | 新增: }; | |
| 34 | 新增: | |
| 35 | 新增: /// <summary> | |
| 36 | 新增: /// 当前聚焦进程 | |
| 37 | 新增: /// </summary> | |
| 38 | 新增: private string activeProcess, activeProcessDescription, activeProcessFile = null; | |
| 39 | 新增: | |
| 40 | 新增: //private DateTime activeStartTime = DateTime.Now; | |
| 41 | 新增: | |
| 42 | 新增: /// <summary> | |
| 43 | 新增: /// 活动计时器 | |
| 44 | 新增: /// </summary> | |
| 45 | 新增: private Stopwatch activeWatcher; | |
| 46 | 新增: /// <summary> | |
| 47 | 新增: /// 睡眠状态 | |
| 48 | 新增: /// </summary> | |
| 49 | 新增: private SleepStatus sleepStatus; | |
| 50 | 新增: | |
| 51 | 新增: /// <summary> | |
| 52 | 新增: /// app config | |
| 53 | 新增: /// </summary> | |
| 54 | 新增: private ConfigModel config; | |
| 55 | 新增: | |
| 56 | 新增: public event EventHandler OnUpdateTime; | |
| 57 | 新增: | |
| 58 | 新增: public Main( | |
| 59 | 新增: IObserver observer, | |
| 60 | 新增: IData data, | |
| 61 | 新增: ISleepdiscover sleepdiscover, | |
| 62 | 新增: IAppConfig appConfig, IDateObserver dateObserver) | |
| 14 | 63 | { |
| 15 | 64 | this.observer = observer; |
| 65 | 新增: this.data = data; | |
| 66 | 新增: this.sleepdiscover = sleepdiscover; | |
| 67 | 新增: this.appConfig = appConfig; | |
| 68 | 新增: this.dateObserver = dateObserver; | |
| 69 | 新增: | |
| 70 | 新增: observer.OnAppActive += Observer_OnAppActive; | |
| 71 | 新增: sleepdiscover.SleepStatusChanged += Sleepdiscover_SleepStatusChanged; | |
| 72 | 新增: activeWatcher = new Stopwatch(); | |
| 73 | 新增: appConfig.ConfigChanged += AppConfig_ConfigChanged; | |
| 74 | 新增: dateObserver.OnDateChanging += DateObserver_OnDateChanging; | |
| 75 | 新增: | |
| 76 | 新增: } | |
| 77 | 新增: | |
| 78 | 新增: private void DateObserver_OnDateChanging(object sender, EventArgs e) | |
| 79 | 新增: { | |
| 80 | 新增: Debug.WriteLine("日期变更前:" + DateTime.Now.ToString()); | |
| 81 | 新增: UpdateTime(); | |
| 82 | 新增: } | |
| 83 | 新增: | |
| 84 | 新增: private void AppConfig_ConfigChanged(ConfigModel oldConfig, ConfigModel newConfig) | |
| 85 | 新增: { | |
| 86 | 新增: if (oldConfig != newConfig) | |
| 87 | 新增: { | |
| 88 | 新增: // 处理开机自启 | |
| 89 | 新增: Shortcut.SetStartup(newConfig.General.IsStartatboot); | |
| 90 | 新增: } | |
| 16 | 91 | } |
| 92 | 新增: | |
| 17 | 93 | public void Run() |
| 18 | 94 | { |
| 95 | 新增: // 加载应用配置(确保配置文件最先加载 | |
| 96 | 新增: appConfig.Load(); | |
| 97 | 新增: config = appConfig.GetConfig(); | |
| 98 | 新增: | |
| 99 | 新增: // 日期变化观察 | |
| 100 | 新增: dateObserver.Start(); | |
| 101 | 新增: | |
| 102 | 新增: // 启动进程观察 | |
| 19 | 103 | observer.Start(); |
| 104 | 新增: | |
| 105 | 新增: // 启动睡眠监测 | |
| 106 | 新增: sleepdiscover.Start(); | |
| 107 | 新增: | |
| 20 | 108 | } |
| 21 | 109 | |
| 22 | 110 | public void Exit() |
| 23 | 111 | { |
| 24 | 112 | observer?.Stop(); |
| 25 | 113 | } |
| 114 | 新增: | |
| 115 | 新增: | |
| 116 | 新增: private void Sleepdiscover_SleepStatusChanged(Enums.SleepStatus sleepStatus) | |
| 117 | 新增: { | |
| 118 | 新增: this.sleepStatus = sleepStatus; | |
| 119 | 新增: | |
| 120 | 新增: Debug.WriteLine("睡眠状态:" + sleepStatus); | |
| 121 | 新增: | |
| 122 | 新增: if (sleepStatus == SleepStatus.Sleep) | |
| 123 | 新增: { | |
| 124 | 新增: // 更新时间 | |
| 125 | 新增: UpdateTime(); | |
| 126 | 新增: | |
| 127 | 新增: activeProcess = null; | |
| 128 | 新增: | |
| 129 | 新增: activeWatcher.Stop(); | |
| 130 | 新增: } | |
| 131 | 新增: } | |
| 132 | 新增: | |
| 133 | 新增: private void Observer_OnAppActive(string processName, string description, string file) | |
| 134 | 新增: { | |
| 135 | 新增: | |
| 136 | 新增: if (activeProcess != processName && activeProcessFile != file) | |
| 137 | 新增: { | |
| 138 | 新增: UpdateTime(); | |
| 139 | 新增: } | |
| 140 | 新增: | |
| 141 | 新增: if (!IgnoreProcess.Contains(processName) | |
| 142 | 新增: && file != string.Empty | |
| 143 | 新增: && sleepStatus != SleepStatus.Sleep) | |
| 144 | 新增: { | |
| 145 | 新增: activeProcess = processName; | |
| 146 | 新增: activeProcessDescription = description; | |
| 147 | 新增: activeProcessFile = file; | |
| 148 | 新增: | |
| 149 | 新增: //activeStartTime = DateTime.Now; | |
| 150 | 新增: activeWatcher.Restart(); | |
| 151 | 新增: | |
| 152 | 新增: // 提取icon | |
| 153 | 新增: Iconer.ExtractFromFile(file, processName, description); | |
| 154 | 新增: } | |
| 155 | 新增: else | |
| 156 | 新增: { | |
| 157 | 新增: activeProcess = null; | |
| 158 | 新增: activeWatcher.Stop(); | |
| 159 | 新增: } | |
| 160 | 新增: } | |
| 161 | 新增: | |
| 162 | 新增: private void HandleLinks(string processName, int seconds) | |
| 163 | 新增: { | |
| 164 | 新增: try | |
| 165 | 新增: { | |
| 166 | 新增: List<LinkModel> links = config.Links != null ? config.Links : new List<LinkModel>(); | |
| 167 | 新增: foreach (LinkModel link in links) | |
| 168 | 新增: { | |
| 169 | 新增: if (link.ProcessList != null | |
| 170 | 新增: && link.ProcessList.Count >= 2 | |
| 171 | 新增: && link.ProcessList.Contains(processName)) | |
| 172 | 新增: { | |
| 173 | 新增: // 属于关联进程 | |
| 174 | 新增: foreach (string linkProcess in link.ProcessList) | |
| 175 | 新增: { | |
| 176 | 新增: if (linkProcess != processName) | |
| 177 | 新增: { | |
| 178 | 新增: if (IsProcessRuning(linkProcess)) | |
| 179 | 新增: { | |
| 180 | 新增: // 同步更新 | |
| 181 | 新增: data.Set(linkProcess, seconds); | |
| 182 | 新增: } | |
| 183 | 新增: | |
| 184 | 新增: } | |
| 185 | 新增: } | |
| 186 | 新增: break; | |
| 187 | 新增: } | |
| 188 | 新增: } | |
| 189 | 新增: } | |
| 190 | 新增: catch (Exception ex) | |
| 191 | 新增: { | |
| 192 | 新增: Logger.Error(ex.Message + ",关联进程更新错误,Process Name: " + processName + ",Time: " + seconds); | |
| 193 | 新增: } | |
| 194 | 新增: | |
| 195 | 新增: } | |
| 196 | 新增: | |
| 197 | 新增: #region 判断进程是否在运行中 | |
| 198 | 新增: /// <summary> | |
| 199 | 新增: /// 判断进程是否在运行中 | |
| 200 | 新增: /// </summary> | |
| 201 | 新增: /// <param name="processName"></param> | |
| 202 | 新增: /// <returns></returns> | |
| 203 | 新增: private bool IsProcessRuning(string processName) | |
| 204 | 新增: { | |
| 205 | 新增: Process[] process = Process.GetProcessesByName(processName); | |
| 206 | 新增: return process != null && process.Length > 0; | |
| 207 | 新增: } | |
| 208 | 新增: #endregion | |
| 209 | 新增: | |
| 210 | 新增: private void UpdateTime() | |
| 211 | 新增: { | |
| 212 | 新增: if (!string.IsNullOrEmpty(activeProcess)) | |
| 213 | 新增: { | |
| 214 | 新增: // 更新计时 | |
| 215 | 新增: | |
| 216 | 新增: int seconds = (int)activeWatcher.Elapsed.TotalSeconds; | |
| 217 | 新增: | |
| 218 | 新增: Debug.WriteLine(sleepStatus + " 进程:" + activeProcess + " 更新时间:" + seconds); | |
| 219 | 新增: if (seconds <= 0) | |
| 220 | 新增: { | |
| 221 | 新增: return; | |
| 222 | 新增: } | |
| 223 | 新增: | |
| 224 | 新增: data.Set(activeProcess, activeProcessDescription, activeProcessFile, seconds); | |
| 225 | 新增: | |
| 226 | 新增: // 关联进程更新 | |
| 227 | 新增: HandleLinks(activeProcess, seconds); | |
| 228 | 新增: | |
| 229 | 新增: OnUpdateTime?.Invoke(this, null); | |
| 230 | 新增: } | |
| 231 | 新增: } | |
| 232 | 新增: | |
| 26 | 233 | } |
| 27 | 234 | } |
| @@ -1,9 +1,12 @@ | ||
| 1 | 删除:using Core.Librarys; | |
| 1 | 新增:using Core.Event; | |
| 2 | 新增:using Core.Librarys; | |
| 2 | 3 | using Core.Servicers.Interfaces; |
| 3 | 4 | using System; |
| 4 | 5 | using System.Collections.Generic; |
| 5 | 6 | using System.Diagnostics; |
| 7 | 新增:using System.IO; | |
| 6 | 8 | using System.Linq; |
| 9 | 新增:using System.Runtime.InteropServices; | |
| 7 | 10 | using System.Text; |
| 8 | 11 | using System.Threading.Tasks; |
| 9 | 12 | |
| @@ -14,6 +17,11 @@ namespace Core.Servicers.Instances | ||
| 14 | 17 | private IntPtr hook; |
| 15 | 18 | Win32API.WinEventDelegate winEventDelegate; |
| 16 | 19 | |
| 20 | 新增: | |
| 21 | 新增: public event ObserverEventHandler OnAppActive; | |
| 22 | 新增: | |
| 23 | 新增: | |
| 24 | 新增: private string activeProcessName, activeProcessFile = null; | |
| 17 | 25 | public Observer() |
| 18 | 26 | { |
| 19 | 27 | winEventDelegate = new Win32API.WinEventDelegate(WinEventProc); |
| @@ -24,14 +32,76 @@ namespace Core.Servicers.Instances | ||
| 24 | 32 | winEventDelegate, 0, 0, 0); |
| 25 | 33 | } |
| 26 | 34 | |
| 27 | 删除: private static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) | |
| 35 | 新增: private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) | |
| 28 | 36 | { |
| 29 | 删除: int processID = 0; | |
| 30 | 删除: Win32API.GetWindowThreadProcessId(hwnd, out processID); | |
| 31 | 删除: Process process = Process.GetProcessById(processID); | |
| 32 | 删除: Debug.WriteLine(process.ProcessName); | |
| 37 | 新增: string processName = String.Empty, processFileName = String.Empty, processDescription = String.Empty; | |
| 38 | 新增: | |
| 39 | 新增: try | |
| 40 | 新增: { | |
| 41 | 新增: int processID = 0; | |
| 42 | 新增: Win32API.GetWindowThreadProcessId(hwnd, out processID); | |
| 43 | 新增: Process process = Process.GetProcessById(processID); | |
| 44 | 新增: processName = process.ProcessName; | |
| 45 | 新增: | |
| 46 | 新增: IntPtr processHandle = IntPtr.Zero; | |
| 47 | 新增: processHandle = Win32API.OpenProcess(0x001F0FFF, false, processID); | |
| 48 | 新增: | |
| 49 | 新增: if (processName == "Snipaste") | |
| 50 | 新增: { | |
| 51 | 新增: | |
| 52 | 新增: int error = Marshal.GetLastWin32Error(); | |
| 53 | 新增: | |
| 54 | 新增: Debug.WriteLine("The last Win32 Error was: " + error); | |
| 55 | 新增: | |
| 56 | 新增: } | |
| 57 | 新增: var buffer = new StringBuilder(4096); | |
| 58 | 新增: Win32API.GetModuleFileNameExA(processHandle, IntPtr.Zero, buffer, buffer.Capacity); | |
| 59 | 新增: processFileName = buffer.ToString(); | |
| 60 | 新增: | |
| 61 | 新增: // handle uwp app | |
| 62 | 新增: if (processFileName.IndexOf("ApplicationFrameHost.exe") != -1) | |
| 63 | 新增: { | |
| 64 | 新增: processFileName = Win32API.UWP_AppName(hwnd, (uint)processID); | |
| 65 | 新增: if (processFileName != string.Empty && processFileName.IndexOf("\\") != -1) | |
| 66 | 新增: { | |
| 67 | 新增: processName = processFileName.Split('\\').Last(); | |
| 68 | 新增: processName = processName.Replace(".exe", ""); | |
| 69 | 新增: } | |
| 70 | 新增: } | |
| 71 | 新增: | |
| 72 | 新增: FileVersionInfo info = FileVersionInfo.GetVersionInfo(processFileName); | |
| 73 | 新增: processDescription = info.FileDescription; | |
| 74 | 新增: | |
| 75 | 新增: | |
| 76 | 新增: //Debug.WriteLine("file name: ---------> " + processFileName); | |
| 77 | 新增: //Debug.WriteLine("app name: ---------> " + processName); | |
| 78 | 新增: //Debug.WriteLine("processDescription: ---------> " + processDescription); | |
| 79 | 新增: } | |
| 80 | 新增: catch (Exception e) | |
| 81 | 新增: { | |
| 82 | 新增: Logger.Error(e.Message + " | Process Name:" + processName + " | Process File:" + processFileName + " | Process Description:" + processDescription); | |
| 83 | 新增: } | |
| 84 | 新增: | |
| 85 | 新增: EventInvoke(processName, processDescription, processFileName); | |
| 33 | 86 | } |
| 34 | 87 | |
| 88 | 新增: private void EventInvoke(string processName, string description, string filename) | |
| 89 | 新增: { | |
| 90 | 新增: // 防止重复和错误响应 | |
| 91 | 新增: if (string.IsNullOrEmpty(processName) || string.IsNullOrEmpty(filename) || !File.Exists(filename)) | |
| 92 | 新增: { | |
| 93 | 新增: return; | |
| 94 | 新增: } | |
| 95 | 新增: if (filename == activeProcessFile && processName == activeProcessName) | |
| 96 | 新增: { | |
| 97 | 新增: return; | |
| 98 | 新增: } | |
| 99 | 新增: | |
| 100 | 新增: activeProcessName = processName; | |
| 101 | 新增: activeProcessFile = filename; | |
| 102 | 新增: | |
| 103 | 新增: OnAppActive?.Invoke(processName, description, filename); | |
| 104 | 新增: } | |
| 35 | 105 | |
| 36 | 106 | public void Stop() |
| 37 | 107 | { |
| @@ -0,0 +1,111 @@ | ||
| 1 | 新增:using Core.Enums; | |
| 2 | 新增:using Core.Event; | |
| 3 | 新增:using Core.Librarys; | |
| 4 | 新增:using Core.Servicers.Interfaces; | |
| 5 | 新增:using System; | |
| 6 | 新增:using System.Collections.Generic; | |
| 7 | 新增:using System.Diagnostics; | |
| 8 | 新增:using System.Linq; | |
| 9 | 新增:using System.Text; | |
| 10 | 新增:using System.Threading.Tasks; | |
| 11 | 新增:using System.Windows; | |
| 12 | 新增:using System.Windows.Threading; | |
| 13 | 新增: | |
| 14 | 新增:namespace Core.Servicers.Instances | |
| 15 | 新增:{ | |
| 16 | 新增: public class Sleepdiscover : ISleepdiscover | |
| 17 | 新增: { | |
| 18 | 新增: public event SleepdiscoverEventHandler SleepStatusChanged; | |
| 19 | 新增: | |
| 20 | 新增: private DispatcherTimer timer; | |
| 21 | 新增: | |
| 22 | 新增: private Point lastPoint; | |
| 23 | 新增: | |
| 24 | 新增: private SleepStatus status = SleepStatus.Wake; | |
| 25 | 新增: | |
| 26 | 新增: // 播放声音开始时间 | |
| 27 | 新增: private DateTime playSoundStartTime; | |
| 28 | 新增: public void Start() | |
| 29 | 新增: { | |
| 30 | 新增: timer = new DispatcherTimer(); | |
| 31 | 新增: timer.Interval = new TimeSpan(0, 2, 0); | |
| 32 | 新增: timer.Tick += Timer_Tick; | |
| 33 | 新增: timer.Start(); | |
| 34 | 新增: | |
| 35 | 新增: Win32API.GetCursorPos(out lastPoint); | |
| 36 | 新增: | |
| 37 | 新增: playSoundStartTime = DateTime.MinValue; | |
| 38 | 新增: } | |
| 39 | 新增: | |
| 40 | 新增: private void Timer_Tick(object sender, EventArgs e) | |
| 41 | 新增: { | |
| 42 | 新增: Point point; | |
| 43 | 新增: Win32API.GetCursorPos(out point); | |
| 44 | 新增: | |
| 45 | 新增: if (point == null) | |
| 46 | 新增: { | |
| 47 | 新增: return; | |
| 48 | 新增: } | |
| 49 | 新增: | |
| 50 | 新增: if (lastPoint == null) | |
| 51 | 新增: { | |
| 52 | 新增: lastPoint = point; | |
| 53 | 新增: return; | |
| 54 | 新增: } | |
| 55 | 新增: | |
| 56 | 新增: if (status == SleepStatus.Wake) | |
| 57 | 新增: { | |
| 58 | 新增: | |
| 59 | 新增: if (lastPoint.ToString() == point.ToString()) | |
| 60 | 新增: { | |
| 61 | 新增: // 处于活跃状态 | |
| 62 | 新增: bool isPlaySound = Win32API.IsWindowsPlayingSound(); | |
| 63 | 新增: // 超过时间未活动鼠标 | |
| 64 | 新增: | |
| 65 | 新增: if (isPlaySound) | |
| 66 | 新增: { | |
| 67 | 新增: // 在播放声音 | |
| 68 | 新增: | |
| 69 | 新增: if (playSoundStartTime == DateTime.MinValue) | |
| 70 | 新增: { | |
| 71 | 新增: playSoundStartTime = DateTime.Now; | |
| 72 | 新增: } | |
| 73 | 新增: else | |
| 74 | 新增: { | |
| 75 | 新增: // 判断声音时间是否超过2个小时 | |
| 76 | 新增: TimeSpan timeSpan = DateTime.Now - playSoundStartTime; | |
| 77 | 新增: | |
| 78 | 新增: if (timeSpan.TotalHours >= 2) | |
| 79 | 新增: { | |
| 80 | 新增: // 超过表示可能睡着了,切换状态 | |
| 81 | 新增: status = SleepStatus.Sleep; | |
| 82 | 新增: | |
| 83 | 新增: playSoundStartTime = DateTime.MinValue; | |
| 84 | 新增: | |
| 85 | 新增: SleepStatusChanged?.Invoke(status); | |
| 86 | 新增: } | |
| 87 | 新增: } | |
| 88 | 新增: } | |
| 89 | 新增: else | |
| 90 | 新增: { | |
| 91 | 新增: // 没有播放声音切换状态 | |
| 92 | 新增: status = SleepStatus.Sleep; | |
| 93 | 新增: SleepStatusChanged?.Invoke(status); | |
| 94 | 新增: } | |
| 95 | 新增: } | |
| 96 | 新增: } | |
| 97 | 新增: else | |
| 98 | 新增: { | |
| 99 | 新增: // 处于休眠状态 | |
| 100 | 新增: if (lastPoint.ToString() != point.ToString()) | |
| 101 | 新增: { | |
| 102 | 新增: // 鼠标活动了切换状态 | |
| 103 | 新增: status = SleepStatus.Wake; | |
| 104 | 新增: SleepStatusChanged?.Invoke(status); | |
| 105 | 新增: } | |
| 106 | 新增: } | |
| 107 | 新增: | |
| 108 | 新增: Win32API.GetCursorPos(out lastPoint); | |
| 109 | 新增: } | |
| 110 | 新增: } | |
| 111 | 新增:} | |
| @@ -0,0 +1,36 @@ | ||
| 1 | 新增:using Core.Event; | |
| 2 | 新增:using Core.Models.Config; | |
| 3 | 新增:using System; | |
| 4 | 新增:using System.Collections.Generic; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增: | |
| 9 | 新增:namespace Core.Servicers.Interfaces | |
| 10 | 新增:{ | |
| 11 | 新增: /// <summary> | |
| 12 | 新增: /// 应用配置 | |
| 13 | 新增: /// </summary> | |
| 14 | 新增: public interface IAppConfig | |
| 15 | 新增: { | |
| 16 | 新增: /// <summary> | |
| 17 | 新增: /// 加载配置 | |
| 18 | 新增: /// </summary> | |
| 19 | 新增: void Load(); | |
| 20 | 新增: | |
| 21 | 新增: /// <summary> | |
| 22 | 新增: /// 获取配置 | |
| 23 | 新增: /// </summary> | |
| 24 | 新增: /// <returns></returns> | |
| 25 | 新增: ConfigModel GetConfig(); | |
| 26 | 新增: | |
| 27 | 新增: /// <summary> | |
| 28 | 新增: /// 更新配置 | |
| 29 | 新增: /// </summary> | |
| 30 | 新增: void Save(); | |
| 31 | 新增: /// <summary> | |
| 32 | 新增: /// 配置修改时发生 | |
| 33 | 新增: /// </summary> | |
| 34 | 新增: event AppConfigEventHandler ConfigChanged; | |
| 35 | 新增: } | |
| 36 | 新增:} | |
| @@ -0,0 +1,67 @@ | ||
| 1 | 新增:using Core.Models; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Text; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增: | |
| 8 | 新增:namespace Core.Servicers.Interfaces | |
| 9 | 新增:{ | |
| 10 | 新增: public interface IData | |
| 11 | 新增: { | |
| 12 | 新增: /// <summary> | |
| 13 | 新增: /// 设置进程数据 | |
| 14 | 新增: /// </summary> | |
| 15 | 新增: /// <param name="processName"></param> | |
| 16 | 新增: /// <param name="processDescription"></param> | |
| 17 | 新增: /// <param name="file"></param> | |
| 18 | 新增: /// <param name="seconds"></param> | |
| 19 | 新增: void Set(string processName, string processDescription, string file, int seconds); | |
| 20 | 新增: | |
| 21 | 新增: /// <summary> | |
| 22 | 新增: /// 获取今天的数据 | |
| 23 | 新增: /// </summary> | |
| 24 | 新增: /// <returns></returns> | |
| 25 | 新增: List<DailyLogModel> GetTodaylogList(); | |
| 26 | 新增: /// <summary> | |
| 27 | 新增: /// 查询指定范围数据 | |
| 28 | 新增: /// </summary> | |
| 29 | 新增: /// <param name="start"></param> | |
| 30 | 新增: /// <param name="end"></param> | |
| 31 | 新增: /// <returns></returns> | |
| 32 | 新增: List<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end); | |
| 33 | 新增: | |
| 34 | 新增: /// <summary> | |
| 35 | 新增: /// 获取本周的数据 | |
| 36 | 新增: /// </summary> | |
| 37 | 新增: /// <returns></returns> | |
| 38 | 新增: List<DailyLogModel> GetThisWeeklogList(); | |
| 39 | 新增: /// <summary> | |
| 40 | 新增: /// 获取上周的数据 | |
| 41 | 新增: /// </summary> | |
| 42 | 新增: /// <returns></returns> | |
| 43 | 新增: List<DailyLogModel> GetLastWeeklogList(); | |
| 44 | 新增: /// <summary> | |
| 45 | 新增: /// 设置进程数据(仅通过进程名可能会出现重复的问题 | |
| 46 | 新增: /// </summary> | |
| 47 | 新增: /// <param name="processName"></param> | |
| 48 | 新增: /// <param name="seconds"></param> | |
| 49 | 新增: void Set(string processName, int seconds); | |
| 50 | 新增: | |
| 51 | 新增: /// <summary> | |
| 52 | 新增: /// 获取指定进程某个月的数据 | |
| 53 | 新增: /// </summary> | |
| 54 | 新增: /// <param name="file"></param> | |
| 55 | 新增: /// <param name="month"></param> | |
| 56 | 新增: /// <returns></returns> | |
| 57 | 新增: List<DailyLogModel> GetProcessMonthLogList(string file, DateTime month); | |
| 58 | 新增: | |
| 59 | 新增: /// <summary> | |
| 60 | 新增: /// 获取一个进程最后一条记录 | |
| 61 | 新增: /// </summary> | |
| 62 | 新增: /// <param name="file"></param> | |
| 63 | 新增: /// <returns></returns> | |
| 64 | 新增: DailyLogModel GetLast(string file); | |
| 65 | 新增: | |
| 66 | 新增: } | |
| 67 | 新增:} | |
| @@ -0,0 +1,23 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace Core.Servicers.Interfaces | |
| 8 | 新增:{ | |
| 9 | 新增: /// <summary> | |
| 10 | 新增: /// 日期变更观察(用于监听日期变化 | |
| 11 | 新增: /// </summary> | |
| 12 | 新增: public interface IDateObserver | |
| 13 | 新增: { | |
| 14 | 新增: /// <summary> | |
| 15 | 新增: /// 启动 | |
| 16 | 新增: /// </summary> | |
| 17 | 新增: void Start(); | |
| 18 | 新增: /// <summary> | |
| 19 | 新增: /// 日期即将变化时发生(前30秒) | |
| 20 | 新增: /// </summary> | |
| 21 | 新增: event EventHandler OnDateChanging; | |
| 22 | 新增: } | |
| 23 | 新增:} | |
| @@ -1,16 +0,0 @@ | ||
| 1 | 删除:using System; | |
| 2 | 删除:using System.Collections.Generic; | |
| 3 | 删除:using System.Linq; | |
| 4 | 删除:using System.Runtime.CompilerServices; | |
| 5 | 删除:using System.Text; | |
| 6 | 删除:using System.Threading.Tasks; | |
| 7 | 删除: | |
| 8 | 删除:namespace Core.Servicers.Interfaces | |
| 9 | 删除:{ | |
| 10 | 删除: public interface ILogger | |
| 11 | 删除: { | |
| 12 | 删除: void Info(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null); | |
| 13 | 删除: void Warn(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null); | |
| 14 | 删除: void Error(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null); | |
| 15 | 删除: } | |
| 16 | 删除:} | |
| @@ -19,5 +19,10 @@ namespace Core.Servicers.Interfaces | ||
| 19 | 19 | /// 退出服务 |
| 20 | 20 | /// </summary> |
| 21 | 21 | void Exit(); |
| 22 | 新增: | |
| 23 | 新增: /// <summary> | |
| 24 | 新增: /// 更新某个进程时间时发生 | |
| 25 | 新增: /// </summary> | |
| 26 | 新增: event EventHandler OnUpdateTime; | |
| 22 | 27 | } |
| 23 | 28 | } |
| @@ -1,4 +1,5 @@ | ||
| 1 | 删除:using System; | |
| 1 | 新增:using Core.Event; | |
| 2 | 新增:using System; | |
| 2 | 3 | using System.Collections.Generic; |
| 3 | 4 | using System.Linq; |
| 4 | 5 | using System.Text; |
| @@ -19,5 +20,10 @@ namespace Core.Servicers.Interfaces | ||
| 19 | 20 | /// 停止观察 |
| 20 | 21 | /// </summary> |
| 21 | 22 | void Stop(); |
| 23 | 新增: | |
| 24 | 新增: /// <summary> | |
| 25 | 新增: /// 切换活跃APP时发生 | |
| 26 | 新增: /// </summary> | |
| 27 | 新增: event ObserverEventHandler OnAppActive; | |
| 22 | 28 | } |
| 23 | 29 | } |
| @@ -0,0 +1,22 @@ | ||
| 1 | 新增:using Core.Event; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Text; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增: | |
| 8 | 新增:namespace Core.Servicers.Interfaces | |
| 9 | 新增:{ | |
| 10 | 新增: public interface ISleepdiscover | |
| 11 | 新增: { | |
| 12 | 新增: /// <summary> | |
| 13 | 新增: /// 启动 | |
| 14 | 新增: /// </summary> | |
| 15 | 新增: void Start(); | |
| 16 | 新增: | |
| 17 | 新增: /// <summary> | |
| 18 | 新增: /// 休眠状态发生更改 | |
| 19 | 新增: /// </summary> | |
| 20 | 新增: event SleepdiscoverEventHandler SleepStatusChanged; | |
| 21 | 新增: } | |
| 22 | 新增:} | |
| @@ -0,0 +1,15 @@ | ||
| 1 | 新增:<?xml version="1.0" encoding="utf-8"?> | |
| 2 | 新增:<packages> | |
| 3 | 新增: <package id="EntityFramework" version="6.3.0" targetFramework="net461" /> | |
| 4 | 新增: <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net461" /> | |
| 5 | 新增: <package id="SQLitePCLRaw.core" version="2.0.6" targetFramework="net461" /> | |
| 6 | 新增: <package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.115.5" targetFramework="net461" /> | |
| 7 | 新增: <package id="System.Buffers" version="4.4.0" targetFramework="net461" /> | |
| 8 | 新增: <package id="System.Data.SQLite" version="1.0.113.7" targetFramework="net461" /> | |
| 9 | 新增: <package id="System.Data.SQLite.Core" version="1.0.115.5" targetFramework="net461" /> | |
| 10 | 新增: <package id="System.Data.SQLite.EF6" version="1.0.113.0" targetFramework="net461" /> | |
| 11 | 新增: <package id="System.Data.SQLite.Linq" version="1.0.115.5" targetFramework="net461" /> | |
| 12 | 新增: <package id="System.Memory" version="4.5.3" targetFramework="net461" /> | |
| 13 | 新增: <package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net461" /> | |
| 14 | 新增: <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net461" /> | |
| 15 | 新增:</packages> | |
| 文件末尾没有换行 | ||
| @@ -10,17 +10,27 @@ EndProject | ||
| 10 | 10 | Global |
| 11 | 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
| 12 | 12 | Debug|Any CPU = Debug|Any CPU |
| 13 | 新增: Debug|x64 = Debug|x64 | |
| 13 | 14 | Release|Any CPU = Release|Any CPU |
| 15 | 新增: Release|x64 = Release|x64 | |
| 14 | 16 | EndGlobalSection |
| 15 | 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution |
| 16 | 18 | {FA57023C-3399-45A4-A339-E453002BD878}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
| 17 | 19 | {FA57023C-3399-45A4-A339-E453002BD878}.Debug|Any CPU.Build.0 = Debug|Any CPU |
| 20 | 新增: {FA57023C-3399-45A4-A339-E453002BD878}.Debug|x64.ActiveCfg = Debug|x64 | |
| 21 | 新增: {FA57023C-3399-45A4-A339-E453002BD878}.Debug|x64.Build.0 = Debug|x64 | |
| 18 | 22 | {FA57023C-3399-45A4-A339-E453002BD878}.Release|Any CPU.ActiveCfg = Release|Any CPU |
| 19 | 23 | {FA57023C-3399-45A4-A339-E453002BD878}.Release|Any CPU.Build.0 = Release|Any CPU |
| 24 | 新增: {FA57023C-3399-45A4-A339-E453002BD878}.Release|x64.ActiveCfg = Release|x64 | |
| 25 | 新增: {FA57023C-3399-45A4-A339-E453002BD878}.Release|x64.Build.0 = Release|x64 | |
| 20 | 26 | {24270E1E-8C24-40B0-A463-98753DFAA4AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
| 21 | 27 | {24270E1E-8C24-40B0-A463-98753DFAA4AE}.Debug|Any CPU.Build.0 = Debug|Any CPU |
| 28 | 新增: {24270E1E-8C24-40B0-A463-98753DFAA4AE}.Debug|x64.ActiveCfg = Debug|x64 | |
| 29 | 新增: {24270E1E-8C24-40B0-A463-98753DFAA4AE}.Debug|x64.Build.0 = Debug|x64 | |
| 22 | 30 | {24270E1E-8C24-40B0-A463-98753DFAA4AE}.Release|Any CPU.ActiveCfg = Release|Any CPU |
| 23 | 31 | {24270E1E-8C24-40B0-A463-98753DFAA4AE}.Release|Any CPU.Build.0 = Release|Any CPU |
| 32 | 新增: {24270E1E-8C24-40B0-A463-98753DFAA4AE}.Release|x64.ActiveCfg = Release|x64 | |
| 33 | 新增: {24270E1E-8C24-40B0-A463-98753DFAA4AE}.Release|x64.Build.0 = Release|x64 | |
| 24 | 34 | EndGlobalSection |
| 25 | 35 | GlobalSection(SolutionProperties) = preSolution |
| 26 | 36 | HideSolutionNode = FALSE |
| @@ -9,6 +9,10 @@ | ||
| 9 | 9 | <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> |
| 10 | 10 | <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> |
| 11 | 11 | </dependentAssembly> |
| 12 | 新增: <dependentAssembly> | |
| 13 | 新增: <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" /> | |
| 14 | 新增: <bindingRedirect oldVersion="0.0.0.0-1.0.115.5" newVersion="1.0.115.5" /> | |
| 15 | 新增: </dependentAssembly> | |
| 12 | 16 | </assemblyBinding> |
| 13 | 17 | </runtime> |
| 14 | 18 | </configuration> |
| @@ -5,6 +5,7 @@ using System; | ||
| 5 | 5 | using System.Collections.Generic; |
| 6 | 6 | using System.Configuration; |
| 7 | 7 | using System.Data; |
| 8 | 新增:using System.Diagnostics; | |
| 8 | 9 | using System.Drawing; |
| 9 | 10 | using System.Linq; |
| 10 | 11 | using System.Threading.Tasks; |
| @@ -23,6 +24,7 @@ namespace UI | ||
| 23 | 24 | public partial class App : Application |
| 24 | 25 | { |
| 25 | 26 | private readonly ServiceProvider serviceProvider; |
| 27 | 新增: private System.Threading.Mutex mutex; | |
| 26 | 28 | |
| 27 | 29 | // 状态栏图标 |
| 28 | 30 | private System.Windows.Forms.NotifyIcon statusBarIcon; |
| @@ -32,13 +34,33 @@ namespace UI | ||
| 32 | 34 | |
| 33 | 35 | // 状态栏图标菜单 |
| 34 | 36 | private ContextMenu contextMenu; |
| 37 | 新增: | |
| 38 | 新增: private DefaultWindow mainWindow; | |
| 35 | 39 | public App() |
| 36 | 40 | { |
| 37 | 41 | var serviceCollection = new ServiceCollection(); |
| 38 | 42 | ConfigureServices(serviceCollection); |
| 39 | 43 | serviceProvider = serviceCollection.BuildServiceProvider(); |
| 44 | 新增: } | |
| 45 | 新增: | |
| 46 | 新增: #region 获取当前程序是否已运行 | |
| 47 | 新增: /// <summary> | |
| 48 | 新增: /// 获取当前程序是否已运行 | |
| 49 | 新增: /// </summary> | |
| 50 | 新增: private bool IsRuned() | |
| 51 | 新增: { | |
| 52 | 新增: bool ret; | |
| 53 | 新增: mutex = new System.Threading.Mutex(true, System.Reflection.Assembly.GetEntryAssembly().ManifestModule.Name, out ret); | |
| 54 | 新增: if (!ret) | |
| 55 | 新增: { | |
| 56 | 新增:#if !DEBUG | |
| 57 | 新增: return true; | |
| 40 | 58 | |
| 59 | 新增:#endif | |
| 60 | 新增: } | |
| 61 | 新增: return false; | |
| 41 | 62 | } |
| 63 | 新增: #endregion | |
| 42 | 64 | |
| 43 | 65 | #region 状态栏图标 |
| 44 | 66 | /// <summary> |
| @@ -49,9 +71,8 @@ namespace UI | ||
| 49 | 71 | CreateStatusBarIconMenu(); |
| 50 | 72 | |
| 51 | 73 | statusBarIcon = new System.Windows.Forms.NotifyIcon(); |
| 52 | 删除: | |
| 53 | 删除: statusBarIcon.Icon = System.Drawing.Icon.ExtractAssociatedIcon( | |
| 54 | 删除: System.Reflection.Assembly.GetEntryAssembly().ManifestModule.Name); | |
| 74 | 新增: statusBarIcon.Text = "Tai!"; | |
| 75 | 新增: statusBarIcon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(System.Reflection.Assembly.GetEntryAssembly().ManifestModule.Name); | |
| 55 | 76 | |
| 56 | 77 | statusBarIcon.Visible = true; |
| 57 | 78 | statusBarIcon.MouseClick += NotifyIcon_MouseClick; |
| @@ -89,8 +110,18 @@ namespace UI | ||
| 89 | 110 | var mainWindowMenuItem = new MenuItem(); |
| 90 | 111 | mainWindowMenuItem.Header = "主界面"; |
| 91 | 112 | mainWindowMenuItem.Click += MainWindowMenuItem_Click; |
| 113 | 新增: var exitMenuItem = new MenuItem(); | |
| 114 | 新增: exitMenuItem.Header = "退出"; | |
| 115 | 新增: exitMenuItem.Click += ExitMenuItem_Click; ; | |
| 92 | 116 | |
| 93 | 117 | contextMenu.Items.Add(mainWindowMenuItem); |
| 118 | 新增: contextMenu.Items.Add(exitMenuItem); | |
| 119 | 新增: | |
| 120 | 新增: } | |
| 121 | 新增: | |
| 122 | 新增: private void ExitMenuItem_Click(object sender, RoutedEventArgs e) | |
| 123 | 新增: { | |
| 124 | 新增: Shutdown(); | |
| 94 | 125 | } |
| 95 | 126 | |
| 96 | 127 | private void MainWindowMenuItem_Click(object sender, RoutedEventArgs e) |
| @@ -101,17 +132,43 @@ namespace UI | ||
| 101 | 132 | |
| 102 | 133 | private void ConfigureServices(IServiceCollection services) |
| 103 | 134 | { |
| 135 | 新增: // 核心服务 | |
| 104 | 136 | services.AddSingleton<IObserver, Observer>(); |
| 105 | 137 | services.AddSingleton<IMain, Main>(); |
| 138 | 新增: services.AddSingleton<IData, Data>(); | |
| 139 | 新增: services.AddSingleton<ISleepdiscover, Sleepdiscover>(); | |
| 140 | 新增: services.AddSingleton<IAppConfig, AppConfig>(); | |
| 141 | 新增: services.AddSingleton<IDateObserver, DateObserver>(); | |
| 106 | 142 | |
| 143 | 新增: // 主窗口 | |
| 107 | 144 | services.AddSingleton<MainViewModel>(); |
| 108 | 145 | services.AddTransient<MainWindow>(); |
| 109 | 146 | |
| 147 | 新增: // 首页 | |
| 110 | 148 | services.AddTransient<IndexPage>(); |
| 149 | 新增: services.AddTransient<IndexPageVM>(); | |
| 150 | 新增: | |
| 151 | 新增: // 数据页 | |
| 152 | 新增: services.AddTransient<DataPage>(); | |
| 153 | 新增: services.AddTransient<DataPageVM>(); | |
| 154 | 新增: | |
| 155 | 新增: // 设置页 | |
| 156 | 新增: services.AddTransient<SettingPage>(); | |
| 157 | 新增: services.AddTransient<SettingPageVM>(); | |
| 158 | 新增: | |
| 159 | 新增: // 详情页 | |
| 160 | 新增: services.AddTransient<DetailPage>(); | |
| 161 | 新增: services.AddTransient<DetailPageVM>(); | |
| 111 | 162 | } |
| 112 | 163 | |
| 113 | 164 | private void OnStartup(object sender, StartupEventArgs e) |
| 114 | 165 | { |
| 166 | 新增: // 阻止多开进程 | |
| 167 | 新增: if (IsRuned()) | |
| 168 | 新增: { | |
| 169 | 新增: Shutdown(); | |
| 170 | 新增: } | |
| 171 | 新增: | |
| 115 | 172 | var main = serviceProvider.GetService<IMain>(); |
| 116 | 173 | main.Run(); |
| 117 | 174 | |
| @@ -128,12 +185,20 @@ namespace UI | ||
| 128 | 185 | |
| 129 | 186 | private void ShowMainWindow() |
| 130 | 187 | { |
| 131 | 删除: var mainWindow = serviceProvider.GetService<MainWindow>(); | |
| 132 | 188 | var dataContext = serviceProvider.GetService<MainViewModel>(); |
| 133 | 删除: mainWindow.DataContext = dataContext; | |
| 134 | 删除: dataContext.SelectGroup(-1); | |
| 135 | 删除: ////dataContext.Uri = nameof(IndexPage); | |
| 189 | 新增: | |
| 190 | 新增: | |
| 191 | 新增: if (mainWindow == null || mainWindow.IsWindowClosed) | |
| 192 | 新增: { | |
| 193 | 新增: mainWindow = serviceProvider.GetService<MainWindow>(); | |
| 194 | 新增: | |
| 195 | 新增: mainWindow.DataContext = dataContext; | |
| 196 | 新增: dataContext.SelectGroup(-1); | |
| 197 | 新增: dataContext.Uri = nameof(IndexPage); | |
| 198 | 新增: } | |
| 199 | 新增: | |
| 136 | 200 | mainWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen; |
| 201 | 新增: mainWindow.WindowState = WindowState.Normal; | |
| 137 | 202 | mainWindow.Show(); |
| 138 | 203 | mainWindow.Activate(); |
| 139 | 204 | } |
| @@ -0,0 +1,18 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Text; | |
| 4 | 新增:using System.Windows; | |
| 5 | 新增:using System.Windows.Controls; | |
| 6 | 新增:using System.Windows.Media; | |
| 7 | 新增:using System.Windows.Media.Animation; | |
| 8 | 新增: | |
| 9 | 新增:namespace UI.Controls.Base | |
| 10 | 新增:{ | |
| 11 | 新增: public class EmptyData : Control | |
| 12 | 新增: { | |
| 13 | 新增: public EmptyData() | |
| 14 | 新增: { | |
| 15 | 新增: DefaultStyleKey = typeof(EmptyData); | |
| 16 | 新增: } | |
| 17 | 新增: } | |
| 18 | 新增:} | |
| @@ -114,6 +114,7 @@ namespace UI.Controls.Base | ||
| 114 | 114 | {IconTypes.Bug,"\xEBE8"}, |
| 115 | 115 | {IconTypes.ChevronUp,"\xE70E"}, |
| 116 | 116 | {IconTypes.BIDashboard,"\xF543"}, |
| 117 | 新增: {IconTypes.Preview,"\xE8FF"}, | |
| 117 | 118 | |
| 118 | 119 | |
| 119 | 120 | }; |
| @@ -137,6 +137,7 @@ namespace UI.Controls.Base | ||
| 137 | 137 | Cat, |
| 138 | 138 | Car, |
| 139 | 139 | Bug, |
| 140 | 删除: BIDashboard | |
| 140 | 新增: BIDashboard, | |
| 141 | 新增: Preview | |
| 141 | 142 | } |
| 142 | 143 | } |
| @@ -0,0 +1,60 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Text; | |
| 4 | 新增:using System.Windows; | |
| 5 | 新增:using System.Windows.Controls; | |
| 6 | 新增:using System.Windows.Media; | |
| 7 | 新增:using System.Windows.Media.Animation; | |
| 8 | 新增: | |
| 9 | 新增:namespace UI.Controls.Base | |
| 10 | 新增:{ | |
| 11 | 新增: public class Placeholder : Control | |
| 12 | 新增: { | |
| 13 | 新增: public CornerRadius CornerRadius | |
| 14 | 新增: { | |
| 15 | 新增: get { return (CornerRadius)GetValue(CornerRadiusProperty); } | |
| 16 | 新增: set { SetValue(CornerRadiusProperty, value); } | |
| 17 | 新增: } | |
| 18 | 新增: public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.Register("CornerRadius", | |
| 19 | 新增: typeof(CornerRadius), | |
| 20 | 新增: typeof(Placeholder)); | |
| 21 | 新增: | |
| 22 | 新增: private Border Flash; | |
| 23 | 新增: public Placeholder() | |
| 24 | 新增: { | |
| 25 | 新增: | |
| 26 | 新增: DefaultStyleKey = typeof(Placeholder); | |
| 27 | 新增: } | |
| 28 | 新增: public override void OnApplyTemplate() | |
| 29 | 新增: { | |
| 30 | 新增: base.OnApplyTemplate(); | |
| 31 | 新增: Flash = GetTemplateChild("Flash") as Border; | |
| 32 | 新增: Loaded += Placeholder_Loaded; | |
| 33 | 新增: } | |
| 34 | 新增: | |
| 35 | 新增: private void Placeholder_Loaded(object sender, RoutedEventArgs e) | |
| 36 | 新增: { | |
| 37 | 新增: Animation(); | |
| 38 | 新增: } | |
| 39 | 新增: | |
| 40 | 新增: private void Animation() | |
| 41 | 新增: { | |
| 42 | 新增: Storyboard storyboard = new Storyboard(); | |
| 43 | 新增: DoubleAnimation scrollAnimation = new DoubleAnimation(); | |
| 44 | 新增: scrollAnimation.From = -10; | |
| 45 | 新增: scrollAnimation.To = ActualWidth; | |
| 46 | 新增: | |
| 47 | 新增: scrollAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 48 | 新增: Storyboard.SetTarget(scrollAnimation, Flash); | |
| 49 | 新增: Storyboard.SetTargetProperty(scrollAnimation, new PropertyPath("RenderTransform.Children[0].X")); | |
| 50 | 新增: scrollAnimation.AutoReverse = true; | |
| 51 | 新增: scrollAnimation.RepeatBehavior = RepeatBehavior.Forever; | |
| 52 | 新增: scrollAnimation.Duration = new Duration(TimeSpan.FromSeconds(1)); | |
| 53 | 新增: | |
| 54 | 新增: storyboard.Children.Add(scrollAnimation); | |
| 55 | 新增: | |
| 56 | 新增: storyboard.Begin(); | |
| 57 | 新增: } | |
| 58 | 新增: | |
| 59 | 新增: } | |
| 60 | 新增:} | |
| @@ -0,0 +1,40 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增:using System.Windows.Input; | |
| 9 | 新增:using UI.Controls.Base; | |
| 10 | 新增: | |
| 11 | 新增:namespace UI.Controls.Button | |
| 12 | 新增:{ | |
| 13 | 新增: public class Button : System.Windows.Controls.Button | |
| 14 | 新增: { | |
| 15 | 新增: public IconTypes Icon | |
| 16 | 新增: { | |
| 17 | 新增: get { return (IconTypes)GetValue(IconProperty); } | |
| 18 | 新增: set { SetValue(IconProperty, value); } | |
| 19 | 新增: } | |
| 20 | 新增: public static readonly DependencyProperty IconProperty = | |
| 21 | 新增: DependencyProperty.Register("Icon", | |
| 22 | 新增: typeof(IconTypes), | |
| 23 | 新增: typeof(Button), new PropertyMetadata(IconTypes.None)); | |
| 24 | 新增: public Button() | |
| 25 | 新增: { | |
| 26 | 新增: DefaultStyleKey = typeof(Button); | |
| 27 | 新增: } | |
| 28 | 新增: | |
| 29 | 新增: //protected override void OnMouseEnter(MouseEventArgs e) | |
| 30 | 新增: //{ | |
| 31 | 新增: // base.OnMouseEnter(e); | |
| 32 | 新增: // VisualStateManager.GoToState(this, "MouseOver", true); | |
| 33 | 新增: //} | |
| 34 | 新增: //protected override void OnMouseLeave(MouseEventArgs e) | |
| 35 | 新增: //{ | |
| 36 | 新增: // base.OnMouseLeave(e); | |
| 37 | 新增: // VisualStateManager.GoToState(this, "Normal", true); | |
| 38 | 新增: //} | |
| 39 | 新增: } | |
| 40 | 新增:} | |
| @@ -0,0 +1,55 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增:using System.Windows.Input; | |
| 9 | 新增:using UI.Controls.Base; | |
| 10 | 新增: | |
| 11 | 新增:namespace UI.Controls.Button | |
| 12 | 新增:{ | |
| 13 | 新增: public class IconButton : Control | |
| 14 | 新增: { | |
| 15 | 新增: public Command Command | |
| 16 | 新增: { | |
| 17 | 新增: get { return (Command)GetValue(CommandProperty); } | |
| 18 | 新增: set { SetValue(CommandProperty, value); } | |
| 19 | 新增: } | |
| 20 | 新增: public static readonly DependencyProperty CommandProperty = | |
| 21 | 新增: DependencyProperty.Register("Command", | |
| 22 | 新增: typeof(Command), | |
| 23 | 新增: typeof(IconButton)); | |
| 24 | 新增: public IconTypes Icon | |
| 25 | 新增: { | |
| 26 | 新增: get { return (IconTypes)GetValue(IconProperty); } | |
| 27 | 新增: set { SetValue(IconProperty, value); } | |
| 28 | 新增: } | |
| 29 | 新增: public static readonly DependencyProperty IconProperty = | |
| 30 | 新增: DependencyProperty.Register("Icon", | |
| 31 | 新增: typeof(IconTypes), | |
| 32 | 新增: typeof(IconButton), new PropertyMetadata(IconTypes.None)); | |
| 33 | 新增: public IconButton() | |
| 34 | 新增: { | |
| 35 | 新增: DefaultStyleKey = typeof(IconButton); | |
| 36 | 新增: } | |
| 37 | 新增: | |
| 38 | 新增: protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) | |
| 39 | 新增: { | |
| 40 | 新增: base.OnMouseLeftButtonUp(e); | |
| 41 | 新增: | |
| 42 | 新增: Command?.Execute(null); | |
| 43 | 新增: } | |
| 44 | 新增: protected override void OnMouseEnter(MouseEventArgs e) | |
| 45 | 新增: { | |
| 46 | 新增: base.OnMouseEnter(e); | |
| 47 | 新增: VisualStateManager.GoToState(this, "MouseOver", true); | |
| 48 | 新增: } | |
| 49 | 新增: protected override void OnMouseLeave(MouseEventArgs e) | |
| 50 | 新增: { | |
| 51 | 新增: base.OnMouseLeave(e); | |
| 52 | 新增: VisualStateManager.GoToState(this, "Normal", true); | |
| 53 | 新增: } | |
| 54 | 新增: } | |
| 55 | 新增:} | |
| @@ -0,0 +1,489 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Diagnostics; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Text; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增:using System.Windows; | |
| 8 | 新增:using System.Windows.Controls; | |
| 9 | 新增:using System.Windows.Data; | |
| 10 | 新增:using System.Windows.Documents; | |
| 11 | 新增:using System.Windows.Input; | |
| 12 | 新增:using System.Windows.Media; | |
| 13 | 新增:using System.Windows.Media.Imaging; | |
| 14 | 新增:using System.Windows.Navigation; | |
| 15 | 新增:using System.Windows.Shapes; | |
| 16 | 新增:using UI.Controls.Base; | |
| 17 | 新增:using UI.Controls.Charts.Model; | |
| 18 | 新增:using UI.Extensions; | |
| 19 | 新增: | |
| 20 | 新增:namespace UI.Controls.Charts | |
| 21 | 新增:{ | |
| 22 | 新增: public class Charts : Control | |
| 23 | 新增: { | |
| 24 | 新增: #region ChartsType 样式类型 | |
| 25 | 新增: /// <summary> | |
| 26 | 新增: /// 样式类型 | |
| 27 | 新增: /// </summary> | |
| 28 | 新增: public ChartsType ChartsType | |
| 29 | 新增: { | |
| 30 | 新增: get { return (ChartsType)GetValue(ChartsTypeProperty); } | |
| 31 | 新增: set { SetValue(ChartsTypeProperty, value); } | |
| 32 | 新增: } | |
| 33 | 新增: public static readonly DependencyProperty ChartsTypeProperty = | |
| 34 | 新增: DependencyProperty.Register("ChartsType", | |
| 35 | 新增: typeof(ChartsType), | |
| 36 | 新增: typeof(Charts)); | |
| 37 | 新增: | |
| 38 | 新增: | |
| 39 | 新增: #endregion | |
| 40 | 新增: #region MaxValueLimit 限制最大值 | |
| 41 | 新增: /// <summary> | |
| 42 | 新增: /// 样式类型 | |
| 43 | 新增: /// </summary> | |
| 44 | 新增: public double MaxValueLimit | |
| 45 | 新增: { | |
| 46 | 新增: get { return (double)GetValue(MaxValueLimitProperty); } | |
| 47 | 新增: set { SetValue(MaxValueLimitProperty, value); } | |
| 48 | 新增: } | |
| 49 | 新增: public static readonly DependencyProperty MaxValueLimitProperty = | |
| 50 | 新增: DependencyProperty.Register("MaxValueLimit", | |
| 51 | 新增: typeof(double), | |
| 52 | 新增: typeof(Charts), | |
| 53 | 新增: new PropertyMetadata((double)0)); | |
| 54 | 新增: | |
| 55 | 新增: | |
| 56 | 新增: #endregion | |
| 57 | 新增: #region ShowLimit 显示条数限制 | |
| 58 | 新增: /// <summary> | |
| 59 | 新增: /// 样式类型 | |
| 60 | 新增: /// </summary> | |
| 61 | 新增: public int ShowLimit | |
| 62 | 新增: { | |
| 63 | 新增: get { return (int)GetValue(ShowLimitProperty); } | |
| 64 | 新增: set { SetValue(ShowLimitProperty, value); } | |
| 65 | 新增: } | |
| 66 | 新增: public static readonly DependencyProperty ShowLimitProperty = | |
| 67 | 新增: DependencyProperty.Register("ShowLimit", | |
| 68 | 新增: typeof(int), | |
| 69 | 新增: typeof(Charts), | |
| 70 | 新增: new PropertyMetadata((int)0)); | |
| 71 | 新增: | |
| 72 | 新增: | |
| 73 | 新增: #endregion | |
| 74 | 新增: #region Data 数据 | |
| 75 | 新增: /// <summary> | |
| 76 | 新增: /// 样式类型 | |
| 77 | 新增: /// </summary> | |
| 78 | 新增: public IEnumerable<ChartsDataModel> Data | |
| 79 | 新增: { | |
| 80 | 新增: get { return (IEnumerable<ChartsDataModel>)GetValue(DataProperty); } | |
| 81 | 新增: set { SetValue(DataProperty, value); } | |
| 82 | 新增: } | |
| 83 | 新增: public static readonly DependencyProperty DataProperty = | |
| 84 | 新增: DependencyProperty.Register("Data", | |
| 85 | 新增: typeof(IEnumerable<ChartsDataModel>), | |
| 86 | 新增: typeof(Charts), | |
| 87 | 新增: new PropertyMetadata(null, new PropertyChangedCallback(OnPropertyChanged)) | |
| 88 | 新增: ); | |
| 89 | 新增: | |
| 90 | 新增: | |
| 91 | 新增: #endregion | |
| 92 | 新增: #region LoadingPlaceholderCount 加载中时占位显示条数 | |
| 93 | 新增: /// <summary> | |
| 94 | 新增: /// 加载中时占位显示条数 | |
| 95 | 新增: /// </summary> | |
| 96 | 新增: public int LoadingPlaceholderCount | |
| 97 | 新增: { | |
| 98 | 新增: get { return (int)GetValue(LoadingPlaceholderCountProperty); } | |
| 99 | 新增: set { SetValue(LoadingPlaceholderCountProperty, value); } | |
| 100 | 新增: } | |
| 101 | 新增: public static readonly DependencyProperty LoadingPlaceholderCountProperty = | |
| 102 | 新增: DependencyProperty.Register("LoadingPlaceholderCount", | |
| 103 | 新增: typeof(int), | |
| 104 | 新增: typeof(Charts), | |
| 105 | 新增: new PropertyMetadata((int)3)); | |
| 106 | 新增: | |
| 107 | 新增: | |
| 108 | 新增: #endregion | |
| 109 | 新增: #region IsLoading 是否在加载中 | |
| 110 | 新增: /// <summary> | |
| 111 | 新增: /// 是否在加载中 | |
| 112 | 新增: /// </summary> | |
| 113 | 新增: public bool IsLoading | |
| 114 | 新增: { | |
| 115 | 新增: get { return (bool)GetValue(IsLoadingProperty); } | |
| 116 | 新增: set { SetValue(IsLoadingProperty, value); } | |
| 117 | 新增: } | |
| 118 | 新增: public static readonly DependencyProperty IsLoadingProperty = | |
| 119 | 新增: DependencyProperty.Register("IsLoading", | |
| 120 | 新增: typeof(bool), | |
| 121 | 新增: typeof(Charts), | |
| 122 | 新增: new PropertyMetadata(false, new PropertyChangedCallback(OnPropertyChanged))); | |
| 123 | 新增: | |
| 124 | 新增: | |
| 125 | 新增: #endregion | |
| 126 | 新增: #region ClickCommand 点击命令 | |
| 127 | 新增: /// <summary> | |
| 128 | 新增: /// 点击命令 | |
| 129 | 新增: /// </summary> | |
| 130 | 新增: public Command ClickCommand | |
| 131 | 新增: { | |
| 132 | 新增: get { return (Command)GetValue(ClickCommandProperty); } | |
| 133 | 新增: set { SetValue(ClickCommandProperty, value); } | |
| 134 | 新增: } | |
| 135 | 新增: public static readonly DependencyProperty ClickCommandProperty = | |
| 136 | 新增: DependencyProperty.Register("ClickCommand", | |
| 137 | 新增: typeof(Command), | |
| 138 | 新增: typeof(Charts)); | |
| 139 | 新增: | |
| 140 | 新增: | |
| 141 | 新增: #endregion | |
| 142 | 新增: private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
| 143 | 新增: { | |
| 144 | 新增: var charts = (d as Charts); | |
| 145 | 新增: if (e.Property == DataProperty) | |
| 146 | 新增: { | |
| 147 | 新增: var dc = charts.ChartsType; | |
| 148 | 新增: charts.Render(); | |
| 149 | 新增: } | |
| 150 | 新增: if (e.Property == IsLoadingProperty) | |
| 151 | 新增: { | |
| 152 | 新增: if (!charts.IsLoading) | |
| 153 | 新增: { | |
| 154 | 新增: charts.Render(); | |
| 155 | 新增: } | |
| 156 | 新增: else | |
| 157 | 新增: { | |
| 158 | 新增: charts.RenderLoadingPlaceholder(); | |
| 159 | 新增: } | |
| 160 | 新增: } | |
| 161 | 新增: | |
| 162 | 新增: } | |
| 163 | 新增: /// <summary> | |
| 164 | 新增: /// 点击项目时发生 | |
| 165 | 新增: /// </summary> | |
| 166 | 新增: public event EventHandler OnItemClick; | |
| 167 | 新增: | |
| 168 | 新增: /// <summary> | |
| 169 | 新增: /// 容器 | |
| 170 | 新增: /// </summary> | |
| 171 | 新增: private StackPanel Container; | |
| 172 | 新增: private WrapPanel CardContainer; | |
| 173 | 新增: private Grid MonthContainer; | |
| 174 | 新增: | |
| 175 | 新增: /// <summary> | |
| 176 | 新增: /// 是否在渲染中 | |
| 177 | 新增: /// </summary> | |
| 178 | 新增: private bool isRendering = false; | |
| 179 | 新增: /// <summary> | |
| 180 | 新增: /// 计算最大值 | |
| 181 | 新增: /// </summary> | |
| 182 | 新增: private double maxValue = 0; | |
| 183 | 新增: public Charts() | |
| 184 | 新增: { | |
| 185 | 新增: DefaultStyleKey = typeof(Charts); | |
| 186 | 新增: } | |
| 187 | 新增: public override void OnApplyTemplate() | |
| 188 | 新增: { | |
| 189 | 新增: base.OnApplyTemplate(); | |
| 190 | 新增: Container = GetTemplateChild("Container") as StackPanel; | |
| 191 | 新增: CardContainer = GetTemplateChild("CardContainer") as WrapPanel; | |
| 192 | 新增: MonthContainer = GetTemplateChild("MonthContainer") as Grid; | |
| 193 | 新增: | |
| 194 | 新增: Loaded += Charts_Loaded; | |
| 195 | 新增: } | |
| 196 | 新增: | |
| 197 | 新增: private void Charts_Loaded(object sender, RoutedEventArgs e) | |
| 198 | 新增: { | |
| 199 | 新增: if (Container != null) | |
| 200 | 新增: { | |
| 201 | 新增: if (IsLoading) | |
| 202 | 新增: { | |
| 203 | 新增: RenderLoadingPlaceholder(); | |
| 204 | 新增: } | |
| 205 | 新增: else | |
| 206 | 新增: { | |
| 207 | 新增: Render(); | |
| 208 | 新增: } | |
| 209 | 新增: } | |
| 210 | 新增: } | |
| 211 | 新增: | |
| 212 | 新增: private void RenderLoadingPlaceholder() | |
| 213 | 新增: { | |
| 214 | 新增: if (Container != null && LoadingPlaceholderCount > 0) | |
| 215 | 新增: { | |
| 216 | 新增: Container.Children.Clear(); | |
| 217 | 新增: CardContainer.Children.Clear(); | |
| 218 | 新增: | |
| 219 | 新增: for (int i = 0; i < LoadingPlaceholderCount; i++) | |
| 220 | 新增: { | |
| 221 | 新增: switch (ChartsType) | |
| 222 | 新增: { | |
| 223 | 新增: case ChartsType.HorizontalA: | |
| 224 | 新增: var item = new ChartsItemTypeA(); | |
| 225 | 新增: item.IsLoading = true; | |
| 226 | 新增: Container.Children.Add(item); | |
| 227 | 新增: break; | |
| 228 | 新增: case ChartsType.Card: | |
| 229 | 新增: var card = new ChartsItemTypeCard(); | |
| 230 | 新增: card.IsLoading = true; | |
| 231 | 新增: CardContainer.Children.Add(card); | |
| 232 | 新增: break; | |
| 233 | 新增: } | |
| 234 | 新增: } | |
| 235 | 新增: | |
| 236 | 新增: } | |
| 237 | 新增: } | |
| 238 | 新增: private void Calculate() | |
| 239 | 新增: { | |
| 240 | 新增: if (Data == null) | |
| 241 | 新增: { | |
| 242 | 新增: return; | |
| 243 | 新增: } | |
| 244 | 新增: // 计算最大值 | |
| 245 | 新增: // 如果设置了固定的最大值则使用,否则查找数据中的最大值 | |
| 246 | 新增: maxValue = MaxValueLimit > 0 ? MaxValueLimit : Data.Count() > 0 ? Data.Max(m => m.Value) : 0; | |
| 247 | 新增: | |
| 248 | 新增: if (ChartsType == ChartsType.HorizontalA) | |
| 249 | 新增: { | |
| 250 | 新增: //不允许最大值小于10,否则效果不好看 | |
| 251 | 新增: if (maxValue < 10) | |
| 252 | 新增: { | |
| 253 | 新增: maxValue = 10; | |
| 254 | 新增: } | |
| 255 | 新增: // 适当增加最大值 | |
| 256 | 新增: maxValue = Math.Round(maxValue / 2, MidpointRounding.AwayFromZero) * 2 + 2; | |
| 257 | 新增: } | |
| 258 | 新增: } | |
| 259 | 新增: | |
| 260 | 新增: private void Render() | |
| 261 | 新增: { | |
| 262 | 新增: if (isRendering || Container == null || CardContainer == null) | |
| 263 | 新增: { | |
| 264 | 新增: return; | |
| 265 | 新增: } | |
| 266 | 新增: Calculate(); | |
| 267 | 新增: Container.Children.Clear(); | |
| 268 | 新增: CardContainer.Children.Clear(); | |
| 269 | 新增: MonthContainer.Children.Clear(); | |
| 270 | 新增: | |
| 271 | 新增: if (Data == null || Data.Count() <= 0) | |
| 272 | 新增: { | |
| 273 | 新增: Container.Children.Add(new EmptyData()); | |
| 274 | 新增: CardContainer.Children.Add(new EmptyData()); | |
| 275 | 新增: return; | |
| 276 | 新增: } | |
| 277 | 新增: | |
| 278 | 新增: isRendering = true; | |
| 279 | 新增: | |
| 280 | 新增: switch (ChartsType) | |
| 281 | 新增: { | |
| 282 | 新增: case ChartsType.HorizontalA: | |
| 283 | 新增: RenderHorizontalAStyle(); | |
| 284 | 新增: break; | |
| 285 | 新增: case ChartsType.Card: | |
| 286 | 新增: RenderCardStyle(); | |
| 287 | 新增: break; | |
| 288 | 新增: case ChartsType.Month: | |
| 289 | 新增: RenderMonthStyle(); | |
| 290 | 新增: break; | |
| 291 | 新增: } | |
| 292 | 新增: } | |
| 293 | 新增: | |
| 294 | 新增: #region 渲染横向样式A | |
| 295 | 新增: private void RenderHorizontalAStyle() | |
| 296 | 新增: { | |
| 297 | 新增: | |
| 298 | 新增: var data = Data.OrderByDescending(x => x.Value).ToList(); | |
| 299 | 新增: | |
| 300 | 新增: foreach (var item in data) | |
| 301 | 新增: { | |
| 302 | 新增: var chartsItem = new ChartsItemTypeA(); | |
| 303 | 新增: chartsItem.Data = item; | |
| 304 | 新增: chartsItem.ToolTip = item.PopupText; | |
| 305 | 新增: chartsItem.MaxValue = maxValue; | |
| 306 | 新增: | |
| 307 | 新增: // 处理点击事件 | |
| 308 | 新增: HandleItemClick(chartsItem, item); | |
| 309 | 新增: | |
| 310 | 新增: Container.Children.Add(chartsItem); | |
| 311 | 新增: if (ShowLimit > 0 && Container.Children.Count == ShowLimit) | |
| 312 | 新增: { | |
| 313 | 新增: break; | |
| 314 | 新增: } | |
| 315 | 新增: } | |
| 316 | 新增: isRendering = false; | |
| 317 | 新增: } | |
| 318 | 新增: #endregion | |
| 319 | 新增: #region 渲染卡片样式Card | |
| 320 | 新增: private void RenderCardStyle() | |
| 321 | 新增: { | |
| 322 | 新增: var data = Data.OrderByDescending(x => x.Value).Take(ShowLimit).ToList(); | |
| 323 | 新增: | |
| 324 | 新增: data.Shuffle(); | |
| 325 | 新增: | |
| 326 | 新增: foreach (var item in data) | |
| 327 | 新增: { | |
| 328 | 新增: var chartsItem = new ChartsItemTypeCard(); | |
| 329 | 新增: chartsItem.Data = item; | |
| 330 | 新增: | |
| 331 | 新增: // 处理点击事件 | |
| 332 | 新增: HandleItemClick(chartsItem, item); | |
| 333 | 新增: | |
| 334 | 新增: chartsItem.MaxValue = maxValue; | |
| 335 | 新增: chartsItem.ToolTip = item.PopupText; | |
| 336 | 新增: CardContainer.Children.Add(chartsItem); | |
| 337 | 新增: } | |
| 338 | 新增: isRendering = false; | |
| 339 | 新增: | |
| 340 | 新增: } | |
| 341 | 新增: #endregion | |
| 342 | 新增: | |
| 343 | 新增: #region 渲染月份样式 | |
| 344 | 新增: private void RenderMonthStyle() | |
| 345 | 新增: { | |
| 346 | 新增: var data = Data.ToList(); | |
| 347 | 新增: DateTime month = data[0].DateTime; | |
| 348 | 新增: | |
| 349 | 新增: int days = DateTime.DaysInMonth(month.Year, month.Month); | |
| 350 | 新增: | |
| 351 | 新增: // 绘制网格 | |
| 352 | 新增: var headerGrid = new Grid(); | |
| 353 | 新增: headerGrid.Margin = new Thickness(0, 0, 0, 10); | |
| 354 | 新增: | |
| 355 | 新增: var dataGrid = new Grid(); | |
| 356 | 新增: | |
| 357 | 新增: string[] week = { "一", "二", "三", "四", "五", "六", "日" }; | |
| 358 | 新增: for (int i = 0; i < 7; i++) | |
| 359 | 新增: { | |
| 360 | 新增: | |
| 361 | 新增: dataGrid.ColumnDefinitions.Add(new ColumnDefinition() | |
| 362 | 新增: { | |
| 363 | 新增: Width = new GridLength(1, GridUnitType.Star) | |
| 364 | 新增: }); | |
| 365 | 新增: headerGrid.ColumnDefinitions.Add(new ColumnDefinition() | |
| 366 | 新增: { | |
| 367 | 新增: Width = new GridLength(1, GridUnitType.Star) | |
| 368 | 新增: }); | |
| 369 | 新增: | |
| 370 | 新增: // 填充头部 | |
| 371 | 新增: var header = new TextBlock(); | |
| 372 | 新增: header.Text = week[i]; | |
| 373 | 新增: header.VerticalAlignment = VerticalAlignment.Center; | |
| 374 | 新增: header.HorizontalAlignment = HorizontalAlignment.Center; | |
| 375 | 新增: Grid.SetColumn(header, i); | |
| 376 | 新增: headerGrid.Children.Add(header); | |
| 377 | 新增: } | |
| 378 | 新增: | |
| 379 | 新增: for (int i = 0; i < 6; i++) | |
| 380 | 新增: { | |
| 381 | 新增: dataGrid.RowDefinitions.Add(new RowDefinition() | |
| 382 | 新增: { | |
| 383 | 新增: Height = new GridLength(1, GridUnitType.Star) | |
| 384 | 新增: }); | |
| 385 | 新增: } | |
| 386 | 新增: | |
| 387 | 新增: // 填充空数据 | |
| 388 | 新增: for (int i = 0; i < days; i++) | |
| 389 | 新增: { | |
| 390 | 新增: var date = new DateTime(month.Year, month.Month, i + 1); | |
| 391 | 新增: var chartsItem = new ChartsItemTypeMonth(); | |
| 392 | 新增: chartsItem.Data = new ChartsDataModel() | |
| 393 | 新增: { | |
| 394 | 新增: DateTime = date, | |
| 395 | 新增: }; | |
| 396 | 新增: var location = CalGridLocation(date); | |
| 397 | 新增: Grid.SetColumn(chartsItem, location[0]); | |
| 398 | 新增: Grid.SetRow(chartsItem, location[1]); | |
| 399 | 新增: dataGrid.Children.Add(chartsItem); | |
| 400 | 新增: Debug.WriteLine((i + 1) + " -> " + location[0] + "," + location[1]); | |
| 401 | 新增: } | |
| 402 | 新增: | |
| 403 | 新增: // 填充有效数据 | |
| 404 | 新增: foreach (var item in data) | |
| 405 | 新增: { | |
| 406 | 新增: if (item.DateTime != null) | |
| 407 | 新增: { | |
| 408 | 新增: int day = item.DateTime.Day; | |
| 409 | 新增: | |
| 410 | 新增: Debug.WriteLine("日期:" + day + "号"); | |
| 411 | 新增: var chartsItem = new ChartsItemTypeMonth(); | |
| 412 | 新增: chartsItem.Data = item; | |
| 413 | 新增: chartsItem.ToolTip = item.PopupText; | |
| 414 | 新增: chartsItem.MaxValue = maxValue; | |
| 415 | 新增: | |
| 416 | 新增: // 处理点击事件 | |
| 417 | 新增: HandleItemClick(chartsItem, item); | |
| 418 | 新增: | |
| 419 | 新增: var location = CalGridLocation(item.DateTime); | |
| 420 | 新增: | |
| 421 | 新增: Grid.SetColumn(chartsItem, location[0]); | |
| 422 | 新增: Grid.SetRow(chartsItem, location[1]); | |
| 423 | 新增: dataGrid.Children.Add(chartsItem); | |
| 424 | 新增: if (ShowLimit > 0 && Container.Children.Count == ShowLimit) | |
| 425 | 新增: { | |
| 426 | 新增: break; | |
| 427 | 新增: } | |
| 428 | 新增: } | |
| 429 | 新增: } | |
| 430 | 新增: | |
| 431 | 新增: var sp = new StackPanel(); | |
| 432 | 新增: sp.Children.Add(headerGrid); | |
| 433 | 新增: sp.Children.Add(dataGrid); | |
| 434 | 新增: | |
| 435 | 新增: MonthContainer.Children.Add(sp); | |
| 436 | 新增: isRendering = false; | |
| 437 | 新增: } | |
| 438 | 新增: | |
| 439 | 新增: private int[] CalGridLocation(DateTime date) | |
| 440 | 新增: { | |
| 441 | 新增: var res = new int[2]; | |
| 442 | 新增: // 判断1号是星期几 | |
| 443 | 新增: int firstDayWeekNum = (int)new DateTime(date.Year, date.Month, 1).DayOfWeek; | |
| 444 | 新增: if (firstDayWeekNum == 0) | |
| 445 | 新增: { | |
| 446 | 新增: firstDayWeekNum = 7; | |
| 447 | 新增: } | |
| 448 | 新增: | |
| 449 | 新增: int col = 0; | |
| 450 | 新增: int row = 0; | |
| 451 | 新增: if (firstDayWeekNum == 1) | |
| 452 | 新增: { | |
| 453 | 新增: col = date.Day - 1; | |
| 454 | 新增: } | |
| 455 | 新增: else | |
| 456 | 新增: { | |
| 457 | 新增: col = date.Day + firstDayWeekNum - 2; | |
| 458 | 新增: } | |
| 459 | 新增: if (col > 6) | |
| 460 | 新增: { | |
| 461 | 新增: row = (int)col / 7; | |
| 462 | 新增: | |
| 463 | 新增: int dayWeekNum = (int)new DateTime(date.Year, date.Month, date.Day).DayOfWeek; | |
| 464 | 新增: if (dayWeekNum == 0) | |
| 465 | 新增: { | |
| 466 | 新增: dayWeekNum = 7; | |
| 467 | 新增: } | |
| 468 | 新增: col = dayWeekNum - 1; | |
| 469 | 新增: | |
| 470 | 新增: | |
| 471 | 新增: } | |
| 472 | 新增: | |
| 473 | 新增: res[0] = col; | |
| 474 | 新增: res[1] = row; | |
| 475 | 新增: return res; | |
| 476 | 新增: } | |
| 477 | 新增: #endregion | |
| 478 | 新增: | |
| 479 | 新增: | |
| 480 | 新增: private void HandleItemClick(UIElement el, ChartsDataModel data) | |
| 481 | 新增: { | |
| 482 | 新增: el.MouseLeftButtonUp += (s, e) => | |
| 483 | 新增: { | |
| 484 | 新增: OnItemClick?.Invoke(data, null); | |
| 485 | 新增: ClickCommand?.Execute(data); | |
| 486 | 新增: }; | |
| 487 | 新增: } | |
| 488 | 新增: } | |
| 489 | 新增:} | |
| @@ -0,0 +1,121 @@ | ||
| 1 | 新增:using Core.Librarys.Image; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Diagnostics; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增:using System.Windows; | |
| 9 | 新增:using System.Windows.Controls; | |
| 10 | 新增:using System.Windows.Data; | |
| 11 | 新增:using System.Windows.Documents; | |
| 12 | 新增:using System.Windows.Input; | |
| 13 | 新增:using System.Windows.Media; | |
| 14 | 新增:using System.Windows.Media.Imaging; | |
| 15 | 新增:using System.Windows.Navigation; | |
| 16 | 新增:using System.Windows.Shapes; | |
| 17 | 新增:using UI.Controls.Charts.Model; | |
| 18 | 新增: | |
| 19 | 新增:namespace UI.Controls.Charts | |
| 20 | 新增:{ | |
| 21 | 新增: public class ChartsItemTypeA : Control | |
| 22 | 新增: { | |
| 23 | 新增: #region ChartsType 样式类型 | |
| 24 | 新增: /// <summary> | |
| 25 | 新增: /// 样式类型 | |
| 26 | 新增: /// </summary> | |
| 27 | 新增: public ChartsDataModel Data | |
| 28 | 新增: { | |
| 29 | 新增: get { return (ChartsDataModel)GetValue(DataProperty); } | |
| 30 | 新增: set { SetValue(DataProperty, value); } | |
| 31 | 新增: } | |
| 32 | 新增: public static readonly DependencyProperty DataProperty = | |
| 33 | 新增: DependencyProperty.Register("Data", | |
| 34 | 新增: typeof(ChartsDataModel), | |
| 35 | 新增: typeof(ChartsItemTypeA)); | |
| 36 | 新增: | |
| 37 | 新增: | |
| 38 | 新增: #endregion | |
| 39 | 新增: | |
| 40 | 新增: #region MaxValue 最大值 | |
| 41 | 新增: /// <summary> | |
| 42 | 新增: /// 样式类型 | |
| 43 | 新增: /// </summary> | |
| 44 | 新增: public double MaxValue | |
| 45 | 新增: { | |
| 46 | 新增: get { return (double)GetValue(MaxValueProperty); } | |
| 47 | 新增: set { SetValue(MaxValueProperty, value); } | |
| 48 | 新增: } | |
| 49 | 新增: public static readonly DependencyProperty MaxValueProperty = | |
| 50 | 新增: DependencyProperty.Register("MaxValue", | |
| 51 | 新增: typeof(double), | |
| 52 | 新增: typeof(ChartsItemTypeA)); | |
| 53 | 新增: | |
| 54 | 新增: | |
| 55 | 新增: #endregion | |
| 56 | 新增: | |
| 57 | 新增: #region IsLoading 是否正在加载中 | |
| 58 | 新增: /// <summary> | |
| 59 | 新增: /// 是否正在加载中 | |
| 60 | 新增: /// </summary> | |
| 61 | 新增: public bool IsLoading | |
| 62 | 新增: { | |
| 63 | 新增: get { return (bool)GetValue(IsLoadingProperty); } | |
| 64 | 新增: set { SetValue(IsLoadingProperty, value); } | |
| 65 | 新增: } | |
| 66 | 新增: public static readonly DependencyProperty IsLoadingProperty = | |
| 67 | 新增: DependencyProperty.Register("IsLoading", | |
| 68 | 新增: typeof(bool), | |
| 69 | 新增: typeof(ChartsItemTypeA)); | |
| 70 | 新增: | |
| 71 | 新增: | |
| 72 | 新增: #endregion | |
| 73 | 新增: private TextBlock NameTextObj, ValueTextObj; | |
| 74 | 新增: private Rectangle ValueBlockObj; | |
| 75 | 新增: private StackPanel ValueContainer; | |
| 76 | 新增: private Image IconObj; | |
| 77 | 新增: private bool isRendering = false; | |
| 78 | 新增: public ChartsItemTypeA() | |
| 79 | 新增: { | |
| 80 | 新增: DefaultStyleKey = typeof(ChartsItemTypeA); | |
| 81 | 新增: } | |
| 82 | 新增: public override void OnApplyTemplate() | |
| 83 | 新增: { | |
| 84 | 新增: base.OnApplyTemplate(); | |
| 85 | 新增: NameTextObj = GetTemplateChild("NameTextObj") as TextBlock; | |
| 86 | 新增: ValueTextObj = GetTemplateChild("ValueTextObj") as TextBlock; | |
| 87 | 新增: ValueBlockObj = GetTemplateChild("ValueBlockObj") as Rectangle; | |
| 88 | 新增: ValueContainer = GetTemplateChild("ValueContainer") as StackPanel; | |
| 89 | 新增: | |
| 90 | 新增: IconObj = GetTemplateChild("IconObj") as Image; | |
| 91 | 新增: | |
| 92 | 新增: Loaded += ChartsItemTypeA_Loaded; | |
| 93 | 新增: } | |
| 94 | 新增: | |
| 95 | 新增: private void ChartsItemTypeA_Loaded(object sender, RoutedEventArgs e) | |
| 96 | 新增: { | |
| 97 | 新增: Render(); | |
| 98 | 新增: } | |
| 99 | 新增: | |
| 100 | 新增: private void Render() | |
| 101 | 新增: { | |
| 102 | 新增: if (isRendering || Data==null) | |
| 103 | 新增: { | |
| 104 | 新增: return; | |
| 105 | 新增: } | |
| 106 | 新增: isRendering = true; | |
| 107 | 新增: NameTextObj.Text = Data.Name; | |
| 108 | 新增: ValueTextObj.Text = Data.Tag; | |
| 109 | 新增: IconObj.Source = Imager.Load(Data.Icon); | |
| 110 | 新增: | |
| 111 | 新增: ValueTextObj.SizeChanged += (e, c) => | |
| 112 | 新增: { | |
| 113 | 新增: if (MaxValue <= 0) | |
| 114 | 新增: { | |
| 115 | 新增: return; | |
| 116 | 新增: } | |
| 117 | 新增: ValueBlockObj.Width = (Data.Value / MaxValue) * (ValueContainer.ActualWidth * 0.95 - ValueTextObj.ActualWidth); | |
| 118 | 新增: }; | |
| 119 | 新增: } | |
| 120 | 新增: } | |
| 121 | 新增:} | |
| @@ -0,0 +1,129 @@ | ||
| 1 | 新增:using Core.Librarys.Image; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Diagnostics; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增:using System.Windows; | |
| 9 | 新增:using System.Windows.Controls; | |
| 10 | 新增:using System.Windows.Data; | |
| 11 | 新增:using System.Windows.Documents; | |
| 12 | 新增:using System.Windows.Input; | |
| 13 | 新增:using System.Windows.Media; | |
| 14 | 新增:using System.Windows.Media.Imaging; | |
| 15 | 新增:using System.Windows.Navigation; | |
| 16 | 新增:using System.Windows.Shapes; | |
| 17 | 新增:using UI.Controls.Charts.Model; | |
| 18 | 新增: | |
| 19 | 新增:namespace UI.Controls.Charts | |
| 20 | 新增:{ | |
| 21 | 新增: public class ChartsItemTypeCard : Control | |
| 22 | 新增: { | |
| 23 | 新增: #region ChartsType 样式类型 | |
| 24 | 新增: /// <summary> | |
| 25 | 新增: /// 样式类型 | |
| 26 | 新增: /// </summary> | |
| 27 | 新增: public ChartsDataModel Data | |
| 28 | 新增: { | |
| 29 | 新增: get { return (ChartsDataModel)GetValue(DataProperty); } | |
| 30 | 新增: set { SetValue(DataProperty, value); } | |
| 31 | 新增: } | |
| 32 | 新增: public static readonly DependencyProperty DataProperty = | |
| 33 | 新增: DependencyProperty.Register("Data", | |
| 34 | 新增: typeof(ChartsDataModel), | |
| 35 | 新增: typeof(ChartsItemTypeCard)); | |
| 36 | 新增: | |
| 37 | 新增: | |
| 38 | 新增: #endregion | |
| 39 | 新增: | |
| 40 | 新增: #region MaxValue 最大值 | |
| 41 | 新增: /// <summary> | |
| 42 | 新增: /// 样式类型 | |
| 43 | 新增: /// </summary> | |
| 44 | 新增: public double MaxValue | |
| 45 | 新增: { | |
| 46 | 新增: get { return (double)GetValue(MaxValueProperty); } | |
| 47 | 新增: set { SetValue(MaxValueProperty, value); } | |
| 48 | 新增: } | |
| 49 | 新增: public static readonly DependencyProperty MaxValueProperty = | |
| 50 | 新增: DependencyProperty.Register("MaxValue", | |
| 51 | 新增: typeof(double), | |
| 52 | 新增: typeof(ChartsItemTypeCard)); | |
| 53 | 新增: | |
| 54 | 新增: | |
| 55 | 新增: #endregion | |
| 56 | 新增: | |
| 57 | 新增: #region IsLoading 是否正在加载中 | |
| 58 | 新增: /// <summary> | |
| 59 | 新增: /// 是否正在加载中 | |
| 60 | 新增: /// </summary> | |
| 61 | 新增: public bool IsLoading | |
| 62 | 新增: { | |
| 63 | 新增: get { return (bool)GetValue(IsLoadingProperty); } | |
| 64 | 新增: set { SetValue(IsLoadingProperty, value); } | |
| 65 | 新增: } | |
| 66 | 新增: public static readonly DependencyProperty IsLoadingProperty = | |
| 67 | 新增: DependencyProperty.Register("IsLoading", | |
| 68 | 新增: typeof(bool), | |
| 69 | 新增: typeof(ChartsItemTypeCard)); | |
| 70 | 新增: | |
| 71 | 新增: | |
| 72 | 新增: #endregion | |
| 73 | 新增: private TextBlock NameTextObj, ValueTextObj; | |
| 74 | 新增: private Rectangle ValueBlockObj; | |
| 75 | 新增: private StackPanel ValueContainer; | |
| 76 | 新增: private Image IconObj; | |
| 77 | 新增: private bool isRendering = false; | |
| 78 | 新增: public ChartsItemTypeCard() | |
| 79 | 新增: { | |
| 80 | 新增: DefaultStyleKey = typeof(ChartsItemTypeCard); | |
| 81 | 新增: } | |
| 82 | 新增: public override void OnApplyTemplate() | |
| 83 | 新增: { | |
| 84 | 新增: base.OnApplyTemplate(); | |
| 85 | 新增: NameTextObj = GetTemplateChild("NameTextObj") as TextBlock; | |
| 86 | 新增: ValueTextObj = GetTemplateChild("ValueTextObj") as TextBlock; | |
| 87 | 新增: ValueBlockObj = GetTemplateChild("ValueBlockObj") as Rectangle; | |
| 88 | 新增: ValueContainer = GetTemplateChild("ValueContainer") as StackPanel; | |
| 89 | 新增: | |
| 90 | 新增: IconObj = GetTemplateChild("IconObj") as Image; | |
| 91 | 新增: | |
| 92 | 新增: Loaded += ChartsItemTypeCard_Loaded; | |
| 93 | 新增: } | |
| 94 | 新增: | |
| 95 | 新增: private void ChartsItemTypeCard_Loaded(object sender, RoutedEventArgs e) | |
| 96 | 新增: { | |
| 97 | 新增: Render(); | |
| 98 | 新增: } | |
| 99 | 新增: | |
| 100 | 新增: private void Render() | |
| 101 | 新增: { | |
| 102 | 新增: if (isRendering || Data == null) | |
| 103 | 新增: { | |
| 104 | 新增: return; | |
| 105 | 新增: } | |
| 106 | 新增: isRendering = true; | |
| 107 | 新增: NameTextObj.Text = Data.Name; | |
| 108 | 新增: NameTextObj.SizeChanged += (e, c) => | |
| 109 | 新增: { | |
| 110 | 新增: // 处理文字过长显示 | |
| 111 | 新增: if (NameTextObj.ActualWidth > 121 && NameTextObj.FontSize > 8) | |
| 112 | 新增: { | |
| 113 | 新增: NameTextObj.FontSize = NameTextObj.FontSize - 1; | |
| 114 | 新增: } | |
| 115 | 新增: }; | |
| 116 | 新增: ValueTextObj.Text = Data.Tag; | |
| 117 | 新增: IconObj.Source = Imager.Load(Data.Icon); | |
| 118 | 新增: | |
| 119 | 新增: ValueTextObj.SizeChanged += (e, c) => | |
| 120 | 新增: { | |
| 121 | 新增: //if (MaxValue <= 0) | |
| 122 | 新增: //{ | |
| 123 | 新增: // return; | |
| 124 | 新增: //} | |
| 125 | 新增: ValueBlockObj.Width = ValueBlockObj.Height = (Data.Value / MaxValue) * ActualWidth; | |
| 126 | 新增: }; | |
| 127 | 新增: } | |
| 128 | 新增: } | |
| 129 | 新增:} | |
| @@ -0,0 +1,158 @@ | ||
| 1 | 新增:using Core.Librarys.Image; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Diagnostics; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增:using System.Windows; | |
| 9 | 新增:using System.Windows.Controls; | |
| 10 | 新增:using System.Windows.Data; | |
| 11 | 新增:using System.Windows.Documents; | |
| 12 | 新增:using System.Windows.Input; | |
| 13 | 新增:using System.Windows.Media; | |
| 14 | 新增:using System.Windows.Media.Imaging; | |
| 15 | 新增:using System.Windows.Navigation; | |
| 16 | 新增:using System.Windows.Shapes; | |
| 17 | 新增:using UI.Controls.Charts.Model; | |
| 18 | 新增: | |
| 19 | 新增:namespace UI.Controls.Charts | |
| 20 | 新增:{ | |
| 21 | 新增: public class ChartsItemTypeMonth : Control | |
| 22 | 新增: { | |
| 23 | 新增: #region Data 数据 | |
| 24 | 新增: /// <summary> | |
| 25 | 新增: /// 数据 | |
| 26 | 新增: /// </summary> | |
| 27 | 新增: public ChartsDataModel Data | |
| 28 | 新增: { | |
| 29 | 新增: get { return (ChartsDataModel)GetValue(DataProperty); } | |
| 30 | 新增: set { SetValue(DataProperty, value); } | |
| 31 | 新增: } | |
| 32 | 新增: public static readonly DependencyProperty DataProperty = | |
| 33 | 新增: DependencyProperty.Register("Data", | |
| 34 | 新增: typeof(ChartsDataModel), | |
| 35 | 新增: typeof(ChartsItemTypeMonth)); | |
| 36 | 新增: | |
| 37 | 新增: | |
| 38 | 新增: #endregion | |
| 39 | 新增: | |
| 40 | 新增: #region MaxValue 最大值 | |
| 41 | 新增: /// <summary> | |
| 42 | 新增: /// 样式类型 | |
| 43 | 新增: /// </summary> | |
| 44 | 新增: public double MaxValue | |
| 45 | 新增: { | |
| 46 | 新增: get { return (double)GetValue(MaxValueProperty); } | |
| 47 | 新增: set { SetValue(MaxValueProperty, value); } | |
| 48 | 新增: } | |
| 49 | 新增: public static readonly DependencyProperty MaxValueProperty = | |
| 50 | 新增: DependencyProperty.Register("MaxValue", | |
| 51 | 新增: typeof(double), | |
| 52 | 新增: typeof(ChartsItemTypeMonth)); | |
| 53 | 新增: | |
| 54 | 新增: | |
| 55 | 新增: #endregion | |
| 56 | 新增: | |
| 57 | 新增: #region IsLoading 是否正在加载中 | |
| 58 | 新增: /// <summary> | |
| 59 | 新增: /// 是否正在加载中 | |
| 60 | 新增: /// </summary> | |
| 61 | 新增: public bool IsLoading | |
| 62 | 新增: { | |
| 63 | 新增: get { return (bool)GetValue(IsLoadingProperty); } | |
| 64 | 新增: set { SetValue(IsLoadingProperty, value); } | |
| 65 | 新增: } | |
| 66 | 新增: public static readonly DependencyProperty IsLoadingProperty = | |
| 67 | 新增: DependencyProperty.Register("IsLoading", | |
| 68 | 新增: typeof(bool), | |
| 69 | 新增: typeof(ChartsItemTypeMonth)); | |
| 70 | 新增: | |
| 71 | 新增: | |
| 72 | 新增: #endregion | |
| 73 | 新增: #region IsSelected 是否选中 | |
| 74 | 新增: /// <summary> | |
| 75 | 新增: /// 是否选中 | |
| 76 | 新增: /// </summary> | |
| 77 | 新增: public bool IsSelected | |
| 78 | 新增: { | |
| 79 | 新增: get { return (bool)GetValue(IsSelectedProperty); } | |
| 80 | 新增: set { SetValue(IsSelectedProperty, value); } | |
| 81 | 新增: } | |
| 82 | 新增: public static readonly DependencyProperty IsSelectedProperty = | |
| 83 | 新增: DependencyProperty.Register("IsSelected", | |
| 84 | 新增: typeof(bool), | |
| 85 | 新增: typeof(ChartsItemTypeMonth)); | |
| 86 | 新增: | |
| 87 | 新增: | |
| 88 | 新增: #endregion | |
| 89 | 新增: private TextBlock NameTextObj, ValueTextObj; | |
| 90 | 新增: private Rectangle ValueBlockObj; | |
| 91 | 新增: private StackPanel ValueContainer; | |
| 92 | 新增: private Image IconObj; | |
| 93 | 新增: private bool isRendering = false; | |
| 94 | 新增: public ChartsItemTypeMonth() | |
| 95 | 新增: { | |
| 96 | 新增: DefaultStyleKey = typeof(ChartsItemTypeMonth); | |
| 97 | 新增: } | |
| 98 | 新增: public override void OnApplyTemplate() | |
| 99 | 新增: { | |
| 100 | 新增: base.OnApplyTemplate(); | |
| 101 | 新增: NameTextObj = GetTemplateChild("NameTextObj") as TextBlock; | |
| 102 | 新增: ValueTextObj = GetTemplateChild("ValueTextObj") as TextBlock; | |
| 103 | 新增: ValueBlockObj = GetTemplateChild("ValueBlockObj") as Rectangle; | |
| 104 | 新增: ValueContainer = GetTemplateChild("ValueContainer") as StackPanel; | |
| 105 | 新增: | |
| 106 | 新增: IconObj = GetTemplateChild("IconObj") as Image; | |
| 107 | 新增: | |
| 108 | 新增: Loaded += ChartsItemTypeMonth_Loaded; | |
| 109 | 新增: } | |
| 110 | 新增: | |
| 111 | 新增: private void ChartsItemTypeMonth_Loaded(object sender, RoutedEventArgs e) | |
| 112 | 新增: { | |
| 113 | 新增: Render(); | |
| 114 | 新增: } | |
| 115 | 新增: | |
| 116 | 新增: private void Render() | |
| 117 | 新增: { | |
| 118 | 新增: if (isRendering || Data == null) | |
| 119 | 新增: { | |
| 120 | 新增: return; | |
| 121 | 新增: } | |
| 122 | 新增: isRendering = true; | |
| 123 | 新增: //Loaded += (s, e) => | |
| 124 | 新增: //{ | |
| 125 | 新增: // ValueBlockObj.Width = ValueBlockObj.Height = (Data.Value / MaxValue) * ActualWidth; | |
| 126 | 新增: //}; | |
| 127 | 新增: ValueBlockObj.Width = ValueBlockObj.Height = (Data.Value / MaxValue) * ActualWidth; | |
| 128 | 新增: ToolTip = Data.DateTime.ToString("yyyy年MM月dd日") + " " + (string.IsNullOrEmpty(Data.Tag) ? "无数据" : Data.Tag); | |
| 129 | 新增: | |
| 130 | 新增: if (Data.DateTime.Date == DateTime.Now.Date) | |
| 131 | 新增: { | |
| 132 | 新增: IsSelected = true; | |
| 133 | 新增: ToolTip = "[今日] " + ToolTip; | |
| 134 | 新增: } | |
| 135 | 新增: //ValueTextObj.Text = Data.DateTime.Day.ToString(); | |
| 136 | 新增: //NameTextObj.Text = Data.Name; | |
| 137 | 新增: //NameTextObj.SizeChanged += (e, c) => | |
| 138 | 新增: //{ | |
| 139 | 新增: // // 处理文字过长显示 | |
| 140 | 新增: // if (NameTextObj.ActualWidth > 121 && NameTextObj.FontSize > 8) | |
| 141 | 新增: // { | |
| 142 | 新增: // NameTextObj.FontSize = NameTextObj.FontSize - 1; | |
| 143 | 新增: // } | |
| 144 | 新增: //}; | |
| 145 | 新增: //ValueTextObj.Text = Data.Tag; | |
| 146 | 新增: //IconObj.Source = Imager.Load(Data.Icon); | |
| 147 | 新增: | |
| 148 | 新增: //ValueTextObj.SizeChanged += (e, c) => | |
| 149 | 新增: //{ | |
| 150 | 新增: // //if (MaxValue <= 0) | |
| 151 | 新增: // //{ | |
| 152 | 新增: // // return; | |
| 153 | 新增: // //} | |
| 154 | 新增: // ValueBlockObj.Width = ValueBlockObj.Height = (Data.Value / MaxValue) * ActualWidth; | |
| 155 | 新增: //}; | |
| 156 | 新增: } | |
| 157 | 新增: } | |
| 158 | 新增:} | |
| @@ -0,0 +1,27 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace UI.Controls.Charts | |
| 8 | 新增:{ | |
| 9 | 新增: /// <summary> | |
| 10 | 新增: /// 图表样式类型 | |
| 11 | 新增: /// </summary> | |
| 12 | 新增: public enum ChartsType | |
| 13 | 新增: { | |
| 14 | 新增: /// <summary> | |
| 15 | 新增: /// 横向A样式 | |
| 16 | 新增: /// </summary> | |
| 17 | 新增: HorizontalA = 1, | |
| 18 | 新增: /// <summary> | |
| 19 | 新增: /// 卡片 | |
| 20 | 新增: /// </summary> | |
| 21 | 新增: Card = 2, | |
| 22 | 新增: /// <summary> | |
| 23 | 新增: /// 月份 | |
| 24 | 新增: /// </summary> | |
| 25 | 新增: Month = 3 | |
| 26 | 新增: } | |
| 27 | 新增:} | |
| @@ -0,0 +1,42 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace UI.Controls.Charts.Model | |
| 8 | 新增:{ | |
| 9 | 新增: public class ChartsDataModel | |
| 10 | 新增: { | |
| 11 | 新增: /// <summary> | |
| 12 | 新增: /// 名称 | |
| 13 | 新增: /// </summary> | |
| 14 | 新增: public string Name { get; set; } | |
| 15 | 新增: | |
| 16 | 新增: /// <summary> | |
| 17 | 新增: /// 值 | |
| 18 | 新增: /// </summary> | |
| 19 | 新增: public double Value { get; set; } | |
| 20 | 新增: /// <summary> | |
| 21 | 新增: /// 列名 | |
| 22 | 新增: /// </summary> | |
| 23 | 新增: public string Tag { get; set; } | |
| 24 | 新增: /// <summary> | |
| 25 | 新增: /// 悬浮文本 | |
| 26 | 新增: /// </summary> | |
| 27 | 新增: public string PopupText { get; set; } | |
| 28 | 新增: /// <summary> | |
| 29 | 新增: /// 是否选中 | |
| 30 | 新增: /// </summary> | |
| 31 | 新增: public bool IsSelected { get; set; } | |
| 32 | 新增: /// <summary> | |
| 33 | 新增: /// 图标文件 | |
| 34 | 新增: /// </summary> | |
| 35 | 新增: public string Icon { get; set; } | |
| 36 | 新增: | |
| 37 | 新增: /// <summary> | |
| 38 | 新增: /// 时间(仅在类型为Month样式时有效) | |
| 39 | 新增: /// </summary> | |
| 40 | 新增: public DateTime DateTime { get; set; } | |
| 41 | 新增: } | |
| 42 | 新增:} | |
| @@ -0,0 +1,285 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Collections.ObjectModel; | |
| 4 | 新增:using System.Collections.Specialized; | |
| 5 | 新增:using System.Diagnostics; | |
| 6 | 新增:using System.Linq; | |
| 7 | 新增:using System.Text; | |
| 8 | 新增:using System.Windows; | |
| 9 | 新增:using System.Windows.Controls; | |
| 10 | 新增:using System.Windows.Input; | |
| 11 | 新增:using System.Windows.Media; | |
| 12 | 新增:using System.Windows.Media.Animation; | |
| 13 | 新增:using UI.Controls.Navigation.Models; | |
| 14 | 新增: | |
| 15 | 新增:namespace UI.Controls.DatePickerBar | |
| 16 | 新增:{ | |
| 17 | 新增: public class DatePickerBar : Control | |
| 18 | 新增: { | |
| 19 | 新增: public DatePickerShowType ShowType | |
| 20 | 新增: { | |
| 21 | 新增: get { return (DatePickerShowType)GetValue(ShowTypeProperty); } | |
| 22 | 新增: set { SetValue(ShowTypeProperty, value); } | |
| 23 | 新增: } | |
| 24 | 新增: public static readonly DependencyProperty ShowTypeProperty = | |
| 25 | 新增: DependencyProperty.Register("ShowType", typeof(DatePickerShowType), typeof(DatePickerBar), new PropertyMetadata(DatePickerShowType.Day)); | |
| 26 | 新增: | |
| 27 | 新增: | |
| 28 | 新增: public DateTime SelectedDate | |
| 29 | 新增: { | |
| 30 | 新增: get { return (DateTime)GetValue(SelectedDateProperty); } | |
| 31 | 新增: set { SetValue(SelectedDateProperty, value); } | |
| 32 | 新增: } | |
| 33 | 新增: public static readonly DependencyProperty SelectedDateProperty = | |
| 34 | 新增: DependencyProperty.Register("SelectedDate", typeof(DateTime), typeof(DatePickerBar), new PropertyMetadata(new PropertyChangedCallback(OnSelectedItemChanged))); | |
| 35 | 新增: | |
| 36 | 新增: private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
| 37 | 新增: { | |
| 38 | 新增: var control = d as DatePickerBar; | |
| 39 | 新增: if (e.NewValue != e.OldValue) | |
| 40 | 新增: { | |
| 41 | 新增: control.ScrollToActive(DateTime.Parse(e.NewValue.ToString())); | |
| 42 | 新增: } | |
| 43 | 新增: } | |
| 44 | 新增: | |
| 45 | 新增: | |
| 46 | 新增: public string SelectedDateString | |
| 47 | 新增: { | |
| 48 | 新增: get { return (string)GetValue(SelectedDateStringProperty); } | |
| 49 | 新增: set { SetValue(SelectedDateStringProperty, value); } | |
| 50 | 新增: } | |
| 51 | 新增: public static readonly DependencyProperty SelectedDateStringProperty = | |
| 52 | 新增: DependencyProperty.Register("SelectedDateString", typeof(string), typeof(DatePickerBar)); | |
| 53 | 新增: | |
| 54 | 新增: private StackPanel Container; | |
| 55 | 新增: private ScrollViewer ScrollViewer; | |
| 56 | 新增: private Dictionary<DateTime, DatePickerBarItem> ItemsDictionary; | |
| 57 | 新增: private List<DateTime> DateList; | |
| 58 | 新增: | |
| 59 | 新增: // 选中标记块 | |
| 60 | 新增: private Border ActiveBlock; | |
| 61 | 新增: // 动画 | |
| 62 | 新增: Storyboard storyboard; | |
| 63 | 新增: public DatePickerBar() | |
| 64 | 新增: { | |
| 65 | 新增: DefaultStyleKey = typeof(DatePickerBar); | |
| 66 | 新增: ItemsDictionary = new Dictionary<DateTime, DatePickerBarItem>(); | |
| 67 | 新增: DateList = new List<DateTime>(); | |
| 68 | 新增: storyboard = new Storyboard(); | |
| 69 | 新增: } | |
| 70 | 新增: | |
| 71 | 新增: | |
| 72 | 新增: | |
| 73 | 新增: public override void OnApplyTemplate() | |
| 74 | 新增: { | |
| 75 | 新增: base.OnApplyTemplate(); | |
| 76 | 新增: Container = GetTemplateChild("Container") as StackPanel; | |
| 77 | 新增: ActiveBlock = GetTemplateChild("ActiveBlock") as Border; | |
| 78 | 新增: ScrollViewer = GetTemplateChild("ScrollViewer") as ScrollViewer; | |
| 79 | 新增: Render(); | |
| 80 | 新增: } | |
| 81 | 新增: | |
| 82 | 新增: | |
| 83 | 新增: private void AddItem(DateTime date) | |
| 84 | 新增: { | |
| 85 | 新增: if (Container != null) | |
| 86 | 新增: { | |
| 87 | 新增: if (DateList.IndexOf(date) != -1) | |
| 88 | 新增: { | |
| 89 | 新增: return; | |
| 90 | 新增: } | |
| 91 | 新增: | |
| 92 | 新增: var control = new DatePickerBarItem(); | |
| 93 | 新增: control.Title = date.Day.ToString(); | |
| 94 | 新增: control.Date = date; | |
| 95 | 新增: control.MouseUp += (e, c) => | |
| 96 | 新增: { | |
| 97 | 新增: if (date > DateTime.Now.Date) | |
| 98 | 新增: { | |
| 99 | 新增: return; | |
| 100 | 新增: } | |
| 101 | 新增: ScrollToActive(date); | |
| 102 | 新增: }; | |
| 103 | 新增: control.Loaded += (e, c) => | |
| 104 | 新增: { | |
| 105 | 新增: if (date == DateTime.Now.Date) | |
| 106 | 新增: { | |
| 107 | 新增: SelectedDate = DateTime.Now.Date; | |
| 108 | 新增: } | |
| 109 | 新增: }; | |
| 110 | 新增: | |
| 111 | 新增: // 后一天 | |
| 112 | 新增: int next = DateList.IndexOf(date.AddDays(+1)); | |
| 113 | 新增: | |
| 114 | 新增: if (next != -1) | |
| 115 | 新增: { | |
| 116 | 新增: int index = next - 1; | |
| 117 | 新增: if (index < 0) | |
| 118 | 新增: { | |
| 119 | 新增: index = 0; | |
| 120 | 新增: } | |
| 121 | 新增: DateList.Insert(index, date); | |
| 122 | 新增: ItemsDictionary.Add(date, control); | |
| 123 | 新增: Container.Children.Insert(index, control); | |
| 124 | 新增: } | |
| 125 | 新增: else | |
| 126 | 新增: { | |
| 127 | 新增: DateList.Add(date); | |
| 128 | 新增: ItemsDictionary.Add(date, control); | |
| 129 | 新增: Container.Children.Add(control); | |
| 130 | 新增: } | |
| 131 | 新增: //if (Data.IndexOf(item) == Data.Count - 1) | |
| 132 | 新增: //{ | |
| 133 | 新增: // control.Loaded += (e, c) => | |
| 134 | 新增: // { | |
| 135 | 新增: // ScrollToActive(); | |
| 136 | 新增: // }; | |
| 137 | 新增: //} | |
| 138 | 新增: //Container.Children.Add(control); | |
| 139 | 新增: //ItemsDictionary.Add(control); | |
| 140 | 新增: } | |
| 141 | 新增: } | |
| 142 | 新增: | |
| 143 | 新增: | |
| 144 | 新增: | |
| 145 | 新增: private void Render() | |
| 146 | 新增: { | |
| 147 | 新增: if (ShowType == DatePickerShowType.Day) | |
| 148 | 新增: { | |
| 149 | 新增: // 前30天 | |
| 150 | 新增: for (int i = 1; i < 30; i++) | |
| 151 | 新增: { | |
| 152 | 新增: AddItem(DateTime.Now.Date.AddDays(-i)); | |
| 153 | 新增: } | |
| 154 | 新增: | |
| 155 | 新增: AddItem(DateTime.Now.Date); | |
| 156 | 新增: | |
| 157 | 新增: // 后十天 | |
| 158 | 新增: for (int i = 1; i < 10; i++) | |
| 159 | 新增: { | |
| 160 | 新增: AddItem(DateTime.Now.Date.AddDays(+i)); | |
| 161 | 新增: } | |
| 162 | 新增: | |
| 163 | 新增: } | |
| 164 | 新增: | |
| 165 | 新增: if (ShowType == DatePickerShowType.Month) | |
| 166 | 新增: { | |
| 167 | 新增: var nowDate = DateTime.Now; | |
| 168 | 新增: for (int i = 1; i < 13; i++) | |
| 169 | 新增: { | |
| 170 | 新增: var date = new DateTime(nowDate.Year, i, 1); | |
| 171 | 新增: AddMonthItem(date); | |
| 172 | 新增: } | |
| 173 | 新增: } | |
| 174 | 新增: | |
| 175 | 新增: | |
| 176 | 新增: | |
| 177 | 新增: } | |
| 178 | 新增: | |
| 179 | 新增: private void AddMonthItem(DateTime date) | |
| 180 | 新增: { | |
| 181 | 新增: | |
| 182 | 新增: if (Container != null) | |
| 183 | 新增: { | |
| 184 | 新增: if (DateList.IndexOf(date) != -1) | |
| 185 | 新增: { | |
| 186 | 新增: return; | |
| 187 | 新增: } | |
| 188 | 新增: | |
| 189 | 新增: var control = new DatePickerBarItem(); | |
| 190 | 新增: control.Title = date.Month.ToString(); | |
| 191 | 新增: control.Date = date; | |
| 192 | 新增: control.MouseUp += (e, c) => | |
| 193 | 新增: { | |
| 194 | 新增: if (date > DateTime.Now.Date) | |
| 195 | 新增: { | |
| 196 | 新增: return; | |
| 197 | 新增: } | |
| 198 | 新增: ScrollToActive(date); | |
| 199 | 新增: }; | |
| 200 | 新增: control.Loaded += (e, c) => | |
| 201 | 新增: { | |
| 202 | 新增: if (date.Year == DateTime.Now.Date.Year | |
| 203 | 新增: && date.Month == DateTime.Now.Date.Month) | |
| 204 | 新增: { | |
| 205 | 新增: SelectedDate = date; | |
| 206 | 新增: } | |
| 207 | 新增: }; | |
| 208 | 新增: | |
| 209 | 新增: | |
| 210 | 新增: DateList.Add(date); | |
| 211 | 新增: ItemsDictionary.Add(date, control); | |
| 212 | 新增: Container.Children.Add(control); | |
| 213 | 新增: | |
| 214 | 新增: } | |
| 215 | 新增: } | |
| 216 | 新增: | |
| 217 | 新增: private void ScrollToActive(DateTime date) | |
| 218 | 新增: { | |
| 219 | 新增: if (ItemsDictionary.ContainsKey(SelectedDate)) | |
| 220 | 新增: { | |
| 221 | 新增: ItemsDictionary[SelectedDate].IsSelected = false; | |
| 222 | 新增: } | |
| 223 | 新增: else | |
| 224 | 新增: { | |
| 225 | 新增: return; | |
| 226 | 新增: } | |
| 227 | 新增: SelectedDate = date; | |
| 228 | 新增: ItemsDictionary[date].IsSelected = true; | |
| 229 | 新增: | |
| 230 | 新增: | |
| 231 | 新增: SelectedDateString = SelectedDate.ToString("yyyy/MM"); | |
| 232 | 新增: if (ShowType == DatePickerShowType.Month) | |
| 233 | 新增: { | |
| 234 | 新增: SelectedDateString = SelectedDate.ToString("yyyy"); | |
| 235 | 新增: } | |
| 236 | 新增: var control = ItemsDictionary[SelectedDate]; | |
| 237 | 新增: | |
| 238 | 新增: Point relativePoint = control.TransformToAncestor(Container).Transform(new Point(0, 0)); | |
| 239 | 新增: | |
| 240 | 新增: double scrollTo = relativePoint.X - (ScrollViewer.ActualWidth / 2) + control.ActualWidth / 2; | |
| 241 | 新增: if (scrollTo < 0) | |
| 242 | 新增: { | |
| 243 | 新增: scrollTo = 0; | |
| 244 | 新增: } | |
| 245 | 新增: | |
| 246 | 新增: ScrollViewer.ScrollToHorizontalOffset(scrollTo); | |
| 247 | 新增: | |
| 248 | 新增: | |
| 249 | 新增: //if (oldSelectedIndex > ItemsDictionary.Count || ItemsDictionary.Count == 0) | |
| 250 | 新增: //{ | |
| 251 | 新增: // return; | |
| 252 | 新增: //} | |
| 253 | 新增: // 获取选中项 | |
| 254 | 新增: | |
| 255 | 新增: //var item = ItemsDictionary[SelectedIndex]; | |
| 256 | 新增: //var oldSelectedItem = ItemsDictionary[oldSelectedIndex]; | |
| 257 | 新增: | |
| 258 | 新增: | |
| 259 | 新增: // 选中项的坐标 | |
| 260 | 新增: //Point relativePoint = item.TransformToAncestor(this).Transform(new Point(0, 0)); | |
| 261 | 新增: | |
| 262 | 新增: // 创建动画 | |
| 263 | 新增: | |
| 264 | 新增: | |
| 265 | 新增: | |
| 266 | 新增: //storyboard.Children.Clear(); | |
| 267 | 新增: //DoubleAnimation scrollAnimation = new DoubleAnimation(); | |
| 268 | 新增: //double scrollX = relativePoint.X - 10; | |
| 269 | 新增: //scrollX = scrollX < 0 ? 0 : scrollX; | |
| 270 | 新增: //scrollAnimation.To = scrollX; | |
| 271 | 新增: | |
| 272 | 新增: //scrollAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 273 | 新增: //Storyboard.SetTarget(scrollAnimation, ActiveBlock); | |
| 274 | 新增: //Storyboard.SetTargetProperty(scrollAnimation, new PropertyPath("RenderTransform.Children[0].X")); | |
| 275 | 新增: | |
| 276 | 新增: //scrollAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.15)); | |
| 277 | 新增: | |
| 278 | 新增: | |
| 279 | 新增: //storyboard.Children.Add(scrollAnimation); | |
| 280 | 新增: | |
| 281 | 新增: | |
| 282 | 新增: //storyboard.Begin(); | |
| 283 | 新增: } | |
| 284 | 新增: } | |
| 285 | 新增:} | |
| @@ -0,0 +1,58 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增: | |
| 9 | 新增:namespace UI.Controls.DatePickerBar | |
| 10 | 新增:{ | |
| 11 | 新增: public class DatePickerBarItem : Control | |
| 12 | 新增: { | |
| 13 | 新增: public string Title | |
| 14 | 新增: { | |
| 15 | 新增: get { return (string)GetValue(TitleProperty); } | |
| 16 | 新增: set { SetValue(TitleProperty, value); } | |
| 17 | 新增: } | |
| 18 | 新增: public static readonly DependencyProperty TitleProperty = | |
| 19 | 新增: DependencyProperty.Register("Title", typeof(string), typeof(DatePickerBarItem)); | |
| 20 | 新增: | |
| 21 | 新增: | |
| 22 | 新增: public bool IsSelected | |
| 23 | 新增: { | |
| 24 | 新增: get { return (bool)GetValue(IsSelectedProperty); } | |
| 25 | 新增: set { SetValue(IsSelectedProperty, value); } | |
| 26 | 新增: } | |
| 27 | 新增: public static readonly DependencyProperty IsSelectedProperty = | |
| 28 | 新增: DependencyProperty.Register("IsSelected", typeof(bool), typeof(DatePickerBarItem)); | |
| 29 | 新增: public bool IsDisabled | |
| 30 | 新增: { | |
| 31 | 新增: get { return (bool)GetValue(IsDisabledProperty); } | |
| 32 | 新增: set { SetValue(IsDisabledProperty, value); } | |
| 33 | 新增: } | |
| 34 | 新增: public static readonly DependencyProperty IsDisabledProperty = | |
| 35 | 新增: DependencyProperty.Register("IsDisabled", typeof(bool), typeof(DatePickerBarItem)); | |
| 36 | 新增: public DateTime Date | |
| 37 | 新增: { | |
| 38 | 新增: get { return (DateTime)GetValue(DateProperty); } | |
| 39 | 新增: set { SetValue(DateProperty, value); } | |
| 40 | 新增: } | |
| 41 | 新增: public static readonly DependencyProperty DateProperty = | |
| 42 | 新增: DependencyProperty.Register("Date", typeof(DateTime), typeof(DatePickerBarItem), new PropertyMetadata(new PropertyChangedCallback(OnPropertyChanged))); | |
| 43 | 新增: | |
| 44 | 新增: private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
| 45 | 新增: { | |
| 46 | 新增: var control = d as DatePickerBarItem; | |
| 47 | 新增: if (e.NewValue != e.OldValue) | |
| 48 | 新增: { | |
| 49 | 新增: control.IsDisabled = control.Date > DateTime.Now.Date; | |
| 50 | 新增: } | |
| 51 | 新增: } | |
| 52 | 新增: public DatePickerBarItem() | |
| 53 | 新增: { | |
| 54 | 新增: DefaultStyleKey = typeof(DatePickerBarItem); | |
| 55 | 新增: | |
| 56 | 新增: } | |
| 57 | 新增: } | |
| 58 | 新增:} | |
| @@ -0,0 +1,23 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace UI.Controls.DatePickerBar | |
| 8 | 新增:{ | |
| 9 | 新增: /// <summary> | |
| 10 | 新增: /// 日期选择器显示类型 | |
| 11 | 新增: /// </summary> | |
| 12 | 新增: public enum DatePickerShowType | |
| 13 | 新增: { | |
| 14 | 新增: /// <summary> | |
| 15 | 新增: /// 日 | |
| 16 | 新增: /// </summary> | |
| 17 | 新增: Day, | |
| 18 | 新增: /// <summary> | |
| 19 | 新增: /// 月 | |
| 20 | 新增: /// </summary> | |
| 21 | 新增: Month, | |
| 22 | 新增: } | |
| 23 | 新增:} | |
| @@ -0,0 +1,23 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增:using System.Windows.Controls.Primitives; | |
| 9 | 新增: | |
| 10 | 新增:namespace UI.Controls.Input | |
| 11 | 新增:{ | |
| 12 | 新增: public class InputBox : TextBox | |
| 13 | 新增: { | |
| 14 | 新增: public string Placeholder { get { return (string)GetValue(PlaceholderProperty); } set { SetValue(PlaceholderProperty, value); } } | |
| 15 | 新增: public static readonly DependencyProperty PlaceholderProperty = DependencyProperty.Register("Placeholder", typeof(string), typeof(InputBox)); | |
| 16 | 新增: public InputBox() | |
| 17 | 新增: { | |
| 18 | 新增: DefaultStyleKey = typeof(InputBox); | |
| 19 | 新增: } | |
| 20 | 新增: | |
| 21 | 新增: | |
| 22 | 新增: } | |
| 23 | 新增:} | |
| @@ -0,0 +1,131 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Collections.ObjectModel; | |
| 4 | 新增:using System.Diagnostics; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增:using System.Windows; | |
| 9 | 新增:using System.Windows.Controls; | |
| 10 | 新增:using System.Windows.Input; | |
| 11 | 新增: | |
| 12 | 新增:namespace UI.Controls.List | |
| 13 | 新增:{ | |
| 14 | 新增: public class BaseList : Control | |
| 15 | 新增: { | |
| 16 | 新增: public ObservableCollection<string> Items { get { return (ObservableCollection<string>)GetValue(ItemsProperty); } set { SetValue(ItemsProperty, value); } } | |
| 17 | 新增: public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<string>), typeof(BaseList), new PropertyMetadata(new PropertyChangedCallback(ItemsChanged))); | |
| 18 | 新增: | |
| 19 | 新增: private static void ItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
| 20 | 新增: { | |
| 21 | 新增: var control = d as BaseList; | |
| 22 | 新增: if (e.NewValue != e.OldValue) | |
| 23 | 新增: { | |
| 24 | 新增: control.Render(); | |
| 25 | 新增: } | |
| 26 | 新增: } | |
| 27 | 新增: | |
| 28 | 新增: public string SelectedItem { get { return (string)GetValue(SelectedItemProperty); } set { SetValue(SelectedItemProperty, value); } } | |
| 29 | 新增: public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(string), typeof(BaseList)); | |
| 30 | 新增: | |
| 31 | 新增: private StackPanel Container; | |
| 32 | 新增: | |
| 33 | 新增: //private Dictionary<int, BaseListItem> ItemsMap; | |
| 34 | 新增: private List<BaseListItem> ItemsMap; | |
| 35 | 新增: | |
| 36 | 新增: public BaseList() | |
| 37 | 新增: { | |
| 38 | 新增: DefaultStyleKey = typeof(BaseList); | |
| 39 | 新增: Items = new ObservableCollection<string>(); | |
| 40 | 新增: ItemsMap = new List<BaseListItem>(); | |
| 41 | 新增: Items.CollectionChanged += Items_CollectionChanged; | |
| 42 | 新增: } | |
| 43 | 新增: | |
| 44 | 新增: private void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) | |
| 45 | 新增: { | |
| 46 | 新增: if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) | |
| 47 | 新增: { | |
| 48 | 新增: foreach (var item in e.NewItems) | |
| 49 | 新增: { | |
| 50 | 新增: AddItem(item as string); | |
| 51 | 新增: } | |
| 52 | 新增: } | |
| 53 | 新增: | |
| 54 | 新增: if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove) | |
| 55 | 新增: { | |
| 56 | 新增: foreach (var item in e.OldItems) | |
| 57 | 新增: { | |
| 58 | 新增: RemoveItem(item as string); | |
| 59 | 新增: } | |
| 60 | 新增: } | |
| 61 | 新增: } | |
| 62 | 新增: | |
| 63 | 新增: public override void OnApplyTemplate() | |
| 64 | 新增: { | |
| 65 | 新增: base.OnApplyTemplate(); | |
| 66 | 新增: Container = GetTemplateChild("Container") as StackPanel; | |
| 67 | 新增: Render(); | |
| 68 | 新增: } | |
| 69 | 新增: | |
| 70 | 新增: private void Render() | |
| 71 | 新增: { | |
| 72 | 新增: if (Container != null) | |
| 73 | 新增: { | |
| 74 | 新增: Container.Children.Clear(); | |
| 75 | 新增: ItemsMap.Clear(); | |
| 76 | 新增: | |
| 77 | 新增: if (Items == null) | |
| 78 | 新增: { | |
| 79 | 新增: return; | |
| 80 | 新增: } | |
| 81 | 新增: | |
| 82 | 新增: foreach (var item in Items) | |
| 83 | 新增: { | |
| 84 | 新增: AddItem(item); | |
| 85 | 新增: } | |
| 86 | 新增: } | |
| 87 | 新增: } | |
| 88 | 新增: | |
| 89 | 新增: private void AddItem(string item) | |
| 90 | 新增: { | |
| 91 | 新增: if (Container == null) | |
| 92 | 新增: { | |
| 93 | 新增: return; | |
| 94 | 新增: } | |
| 95 | 新增: var itemControl = new BaseListItem(); | |
| 96 | 新增: itemControl.Text = item; | |
| 97 | 新增: itemControl.MouseLeftButtonUp += ItemClick; | |
| 98 | 新增: itemControl.MouseRightButtonUp += ItemClick; | |
| 99 | 新增: ItemsMap.Add(itemControl); | |
| 100 | 新增: Container.Children.Add(itemControl); | |
| 101 | 新增: } | |
| 102 | 新增: | |
| 103 | 新增: private void RemoveItem(string item) | |
| 104 | 新增: { | |
| 105 | 新增: if (Container == null) | |
| 106 | 新增: { | |
| 107 | 新增: return; | |
| 108 | 新增: } | |
| 109 | 新增: var control = ItemsMap.Where(m => m.Text == item).FirstOrDefault(); | |
| 110 | 新增: if (control != null) | |
| 111 | 新增: { | |
| 112 | 新增: Container.Children.Remove(control); | |
| 113 | 新增: } | |
| 114 | 新增: } | |
| 115 | 新增: | |
| 116 | 新增: private void ItemClick(object sender, MouseButtonEventArgs e) | |
| 117 | 新增: { | |
| 118 | 新增: ClearSelectedItems(); | |
| 119 | 新增: (sender as BaseListItem).IsSelected = true; | |
| 120 | 新增: SelectedItem = (sender as BaseListItem).Text; | |
| 121 | 新增: } | |
| 122 | 新增: | |
| 123 | 新增: private void ClearSelectedItems() | |
| 124 | 新增: { | |
| 125 | 新增: foreach (var item in ItemsMap) | |
| 126 | 新增: { | |
| 127 | 新增: item.IsSelected = false; | |
| 128 | 新增: } | |
| 129 | 新增: } | |
| 130 | 新增: } | |
| 131 | 新增:} | |
| @@ -0,0 +1,40 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增:using System.Windows.Input; | |
| 9 | 新增: | |
| 10 | 新增:namespace UI.Controls.List | |
| 11 | 新增:{ | |
| 12 | 新增: public class BaseListItem : Control | |
| 13 | 新增: { | |
| 14 | 新增: public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } | |
| 15 | 新增: public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(BaseListItem)); | |
| 16 | 新增: | |
| 17 | 新增: public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty); } set { SetValue(IsSelectedProperty, value); } } | |
| 18 | 新增: public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(BaseListItem)); | |
| 19 | 新增: | |
| 20 | 新增: //public Command RemoveCommand { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } | |
| 21 | 新增: //public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(BaseListItem)); | |
| 22 | 新增: | |
| 23 | 新增: //public event EventHandler ItemChanged; | |
| 24 | 新增: | |
| 25 | 新增: public BaseListItem() | |
| 26 | 新增: { | |
| 27 | 新增: DefaultStyleKey = typeof(BaseListItem); | |
| 28 | 新增: } | |
| 29 | 新增: protected override void OnMouseEnter(MouseEventArgs e) | |
| 30 | 新增: { | |
| 31 | 新增: base.OnMouseEnter(e); | |
| 32 | 新增: VisualStateManager.GoToState(this, "MouseOver", true); | |
| 33 | 新增: } | |
| 34 | 新增: protected override void OnMouseLeave(MouseEventArgs e) | |
| 35 | 新增: { | |
| 36 | 新增: base.OnMouseLeave(e); | |
| 37 | 新增: VisualStateManager.GoToState(this, "Normal", true); | |
| 38 | 新增: } | |
| 39 | 新增: } | |
| 40 | 新增:} | |
| @@ -312,9 +312,14 @@ namespace UI.Controls.Navigation | ||
| 312 | 312 | if (e.ChangedButton == System.Windows.Input.MouseButton.Left) |
| 313 | 313 | { |
| 314 | 314 | //左键选中 |
| 315 | 新增: | |
| 315 | 316 | SelectedItem = Data.Where(m => m.ID == navitem.ID).FirstOrDefault(); |
| 316 | 317 | OnSelected?.Invoke(this, null); |
| 317 | 删除: ScrollToActive(); | |
| 318 | 新增: | |
| 319 | 新增: if (SelectedItem != null && SelectedItem.ID != navitem.ID) | |
| 320 | 新增: { | |
| 321 | 新增: ScrollToActive(); | |
| 322 | 新增: } | |
| 318 | 323 | } |
| 319 | 324 | if (e.ChangedButton == System.Windows.Input.MouseButton.Right) |
| 320 | 325 | { |
| @@ -0,0 +1,326 @@ | ||
| 1 | 新增:using Core.Models.Config; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections; | |
| 4 | 新增:using System.Collections.Generic; | |
| 5 | 新增:using System.Collections.ObjectModel; | |
| 6 | 新增:using System.Diagnostics; | |
| 7 | 新增:using System.Linq; | |
| 8 | 新增:using System.Reflection; | |
| 9 | 新增:using System.Text; | |
| 10 | 新增:using System.Threading.Tasks; | |
| 11 | 新增:using System.Windows; | |
| 12 | 新增:using System.Windows.Controls; | |
| 13 | 新增:using System.Windows.Media; | |
| 14 | 新增: | |
| 15 | 新增:namespace UI.Controls.SettingPanel | |
| 16 | 新增:{ | |
| 17 | 新增: | |
| 18 | 新增: public class SettingPanel : Control | |
| 19 | 新增: { | |
| 20 | 新增: public struct Config | |
| 21 | 新增: { | |
| 22 | 新增: public ConfigAttribute Attribute { get; set; } | |
| 23 | 新增: public PropertyInfo PropertyInfo { get; set; } | |
| 24 | 新增: } | |
| 25 | 新增: public object Data { get { return (object)GetValue(DataProperty); } set { SetValue(DataProperty, value); } } | |
| 26 | 新增: public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(SettingPanel), new PropertyMetadata(new PropertyChangedCallback(OnDataChanged))); | |
| 27 | 新增: | |
| 28 | 新增: private static void OnDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
| 29 | 新增: { | |
| 30 | 新增: var control = d as SettingPanel; | |
| 31 | 新增: if (e.NewValue != e.OldValue) | |
| 32 | 新增: { | |
| 33 | 新增: control.Render(); | |
| 34 | 新增: } | |
| 35 | 新增: } | |
| 36 | 新增: | |
| 37 | 新增: | |
| 38 | 新增: private StackPanel Container; | |
| 39 | 新增: private object configData; | |
| 40 | 新增: private readonly string nosetGroupKey = "noset_group"; | |
| 41 | 新增: private Dictionary<string, List<Config>> configList; | |
| 42 | 新增: public SettingPanel() | |
| 43 | 新增: { | |
| 44 | 新增: DefaultStyleKey = typeof(SettingPanel); | |
| 45 | 新增: } | |
| 46 | 新增: public override void OnApplyTemplate() | |
| 47 | 新增: { | |
| 48 | 新增: base.OnApplyTemplate(); | |
| 49 | 新增: | |
| 50 | 新增: Container = GetTemplateChild("Container") as StackPanel; | |
| 51 | 新增: | |
| 52 | 新增: Render(); | |
| 53 | 新增: } | |
| 54 | 新增: private void Render() | |
| 55 | 新增: { | |
| 56 | 新增: configList = new Dictionary<string, List<Config>>(); | |
| 57 | 新增: configList.Add(nosetGroupKey, new List<Config>()); | |
| 58 | 新增: | |
| 59 | 新增: if (Container == null) | |
| 60 | 新增: { | |
| 61 | 新增: return; | |
| 62 | 新增: } | |
| 63 | 新增: | |
| 64 | 新增: Container.Children.Clear(); | |
| 65 | 新增: | |
| 66 | 新增: if (Data == null) | |
| 67 | 新增: { | |
| 68 | 新增: return; | |
| 69 | 新增: } | |
| 70 | 新增: | |
| 71 | 新增: | |
| 72 | 新增: | |
| 73 | 新增: if (Data is IEnumerable) | |
| 74 | 新增: { | |
| 75 | 新增: // 多例 | |
| 76 | 新增: RenderMultiPanel(); | |
| 77 | 新增: } | |
| 78 | 新增: else | |
| 79 | 新增: { | |
| 80 | 新增: // 单例 | |
| 81 | 新增: RenderSinglePanel(); | |
| 82 | 新增: } | |
| 83 | 新增: | |
| 84 | 新增: | |
| 85 | 新增: } | |
| 86 | 新增: | |
| 87 | 新增: | |
| 88 | 新增: #region 渲染多例面板 | |
| 89 | 新增: /// <summary> | |
| 90 | 新增: /// 渲染多例面板 | |
| 91 | 新增: /// </summary> | |
| 92 | 新增: | |
| 93 | 新增: private void RenderMultiPanel() | |
| 94 | 新增: { | |
| 95 | 新增: var dataList = Data as IEnumerable<object>; | |
| 96 | 新增: var list = dataList.ToList(); | |
| 97 | 新增: var cacheList = new Dictionary<int, object>(); | |
| 98 | 新增: | |
| 99 | 新增: var dataType = Data.GetType(); | |
| 100 | 新增: var itemType = dataType.GenericTypeArguments[0]; | |
| 101 | 新增: var test1 = dataType.GetGenericArguments()[0]; | |
| 102 | 新增: | |
| 103 | 新增: var emptyData = Activator.CreateInstance(itemType); | |
| 104 | 新增: | |
| 105 | 新增: // 添加按钮 | |
| 106 | 新增: var addBtn = new Button.Button(); | |
| 107 | 新增: addBtn.Content = "新建项"; | |
| 108 | 新增: addBtn.Width = 150; | |
| 109 | 新增: addBtn.Icon = Base.IconTypes.CalculatorAddition; | |
| 110 | 新增: addBtn.Click += (s, e) => | |
| 111 | 新增: { | |
| 112 | 新增: int id = cacheList.Keys.Count > 0 ? cacheList.Keys.Max() + 1 : 1; | |
| 113 | 新增: | |
| 114 | 新增: cacheList.Add(id, emptyData); | |
| 115 | 新增: | |
| 116 | 新增: var panel = CreateMultiPanel(emptyData, id, cacheList); | |
| 117 | 新增: | |
| 118 | 新增: Container.Children.Insert(Container.Children.Count - 1, panel); | |
| 119 | 新增: | |
| 120 | 新增: }; | |
| 121 | 新增: Container.Children.Add(addBtn); | |
| 122 | 新增: | |
| 123 | 新增: | |
| 124 | 新增: // 渲染数据 | |
| 125 | 新增: for (int i = 0; i < list.Count; i++) | |
| 126 | 新增: { | |
| 127 | 新增: int id = cacheList.Keys.Count > 0 ? cacheList.Keys.Max() + 1 : 1; | |
| 128 | 新增: | |
| 129 | 新增: cacheList.Add(id, list[i]); | |
| 130 | 新增: var panel = CreateMultiPanel(list[i], id, cacheList); | |
| 131 | 新增: Container.Children.Insert(Container.Children.Count - 1, panel); | |
| 132 | 新增: } | |
| 133 | 新增: | |
| 134 | 新增: | |
| 135 | 新增: | |
| 136 | 新增: } | |
| 137 | 新增: | |
| 138 | 新增: | |
| 139 | 新增: private SettingPanelMultiItem CreateMultiPanel(object data, int id, Dictionary<int, object> cacheList) | |
| 140 | 新增: { | |
| 141 | 新增: var panel = new SettingPanelMultiItem(); | |
| 142 | 新增: panel.Data = data; | |
| 143 | 新增: panel.Tag = id; | |
| 144 | 新增: panel.DataChanged += (e, c) => | |
| 145 | 新增: { | |
| 146 | 新增: int pid = (int)panel.Tag; | |
| 147 | 新增: | |
| 148 | 新增: if (cacheList.ContainsKey(pid)) | |
| 149 | 新增: { | |
| 150 | 新增: // 更新 | |
| 151 | 新增: cacheList[pid] = panel.Data; | |
| 152 | 新增: | |
| 153 | 新增: var listType = typeof(List<>); | |
| 154 | 新增: var constructedListType = listType.MakeGenericType(panel.Data.GetType()); | |
| 155 | 新增: | |
| 156 | 新增: var newList = (IList)Activator.CreateInstance(constructedListType); | |
| 157 | 新增: | |
| 158 | 新增: foreach (var item in cacheList.Values) | |
| 159 | 新增: { | |
| 160 | 新增: newList.Add(item); | |
| 161 | 新增: } | |
| 162 | 新增: Data = newList; | |
| 163 | 新增: } | |
| 164 | 新增: }; | |
| 165 | 新增: panel.OnRemoveAction = new Command(new Action<object>((s) => | |
| 166 | 新增: { | |
| 167 | 新增: cacheList.Remove(id); | |
| 168 | 新增: var listType = typeof(List<>); | |
| 169 | 新增: var constructedListType = listType.MakeGenericType(panel.Data.GetType()); | |
| 170 | 新增: | |
| 171 | 新增: var newList = (IList)Activator.CreateInstance(constructedListType); | |
| 172 | 新增: foreach (var item in cacheList.Values) | |
| 173 | 新增: { | |
| 174 | 新增: newList.Add(item); | |
| 175 | 新增: } | |
| 176 | 新增: Data = newList; | |
| 177 | 新增: })); | |
| 178 | 新增: return panel; | |
| 179 | 新增: } | |
| 180 | 新增: #endregion | |
| 181 | 新增: | |
| 182 | 新增: /// <summary> | |
| 183 | 新增: /// 渲染单例面板 | |
| 184 | 新增: /// </summary> | |
| 185 | 新增: private void RenderSinglePanel() | |
| 186 | 新增: { | |
| 187 | 新增: configData = Activator.CreateInstance(Data.GetType()); | |
| 188 | 新增: | |
| 189 | 新增: // 遍历方法特性 | |
| 190 | 新增: foreach (PropertyInfo pi in Data.GetType().GetProperties()) | |
| 191 | 新增: { | |
| 192 | 新增: foreach (Attribute attr in pi.GetCustomAttributes(true)) | |
| 193 | 新增: { | |
| 194 | 新增: if (attr is ConfigAttribute) | |
| 195 | 新增: { | |
| 196 | 新增: ConfigAttribute attribute = (ConfigAttribute)attr; | |
| 197 | 新增: | |
| 198 | 新增: var config = new Config() | |
| 199 | 新增: { | |
| 200 | 新增: Attribute = attribute, | |
| 201 | 新增: PropertyInfo = pi | |
| 202 | 新增: }; | |
| 203 | 新增: if (string.IsNullOrEmpty(attribute.Group)) | |
| 204 | 新增: { | |
| 205 | 新增: // 未分组 | |
| 206 | 新增: configList[nosetGroupKey].Add(config); | |
| 207 | 新增: } | |
| 208 | 新增: else | |
| 209 | 新增: { | |
| 210 | 新增: if (!configList.ContainsKey(attribute.Group)) | |
| 211 | 新增: { | |
| 212 | 新增: configList.Add(attribute.Group, new List<Config>()); | |
| 213 | 新增: } | |
| 214 | 新增: configList[attribute.Group].Add(config); | |
| 215 | 新增: } | |
| 216 | 新增: | |
| 217 | 新增: | |
| 218 | 新增: } | |
| 219 | 新增: } | |
| 220 | 新增: } | |
| 221 | 新增: | |
| 222 | 新增: // 渲染已分组的项目 | |
| 223 | 新增: foreach (var item in configList) | |
| 224 | 新增: { | |
| 225 | 新增: if (item.Key != nosetGroupKey) | |
| 226 | 新增: { | |
| 227 | 新增: RenderGroup(item.Value, item.Key); | |
| 228 | 新增: } | |
| 229 | 新增: } | |
| 230 | 新增: | |
| 231 | 新增: // 渲染未分组项目 | |
| 232 | 新增: RenderGroup(configList[nosetGroupKey]); | |
| 233 | 新增: } | |
| 234 | 新增: private void RenderGroup(List<Config> configList, string groupName = null) | |
| 235 | 新增: { | |
| 236 | 新增: if (configList == null || configList.Count == 0) | |
| 237 | 新增: { | |
| 238 | 新增: return; | |
| 239 | 新增: } | |
| 240 | 新增: var itemContainer = new StackPanel(); | |
| 241 | 新增: | |
| 242 | 新增: var sortList = configList.OrderBy(m => m.Attribute.Index).ToList(); | |
| 243 | 新增: for (int i = 0; i < sortList.Count; i++) | |
| 244 | 新增: { | |
| 245 | 新增: var config = sortList[i]; | |
| 246 | 新增: | |
| 247 | 新增: var control = RenderConfigItem(config.Attribute, config.PropertyInfo); | |
| 248 | 新增: if (control != null) | |
| 249 | 新增: { | |
| 250 | 新增: itemContainer.Children.Add(control); | |
| 251 | 新增: | |
| 252 | 新增: if (i != sortList.Count - 1) | |
| 253 | 新增: { | |
| 254 | 新增: // 添加分割线 | |
| 255 | 新增: var spliteLine = new Border(); | |
| 256 | 新增: spliteLine.Height = 1; | |
| 257 | 新增: spliteLine.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ededed")); | |
| 258 | 新增: itemContainer.Children.Add(spliteLine); | |
| 259 | 新增: } | |
| 260 | 新增: } | |
| 261 | 新增: | |
| 262 | 新增: | |
| 263 | 新增: } | |
| 264 | 新增: | |
| 265 | 新增: var groupControl = GetCreateGroupContainer(itemContainer, groupName); | |
| 266 | 新增: Container.Children.Add(groupControl); | |
| 267 | 新增: } | |
| 268 | 新增: | |
| 269 | 新增: private StackPanel GetCreateGroupContainer(UIElement item, string groupName = null) | |
| 270 | 新增: { | |
| 271 | 新增: var container = new StackPanel(); | |
| 272 | 新增: container.Margin = new Thickness(0, 10, 0, 20); | |
| 273 | 新增: if (groupName != null) | |
| 274 | 新增: { | |
| 275 | 新增: var groupNameControl = new TextBlock(); | |
| 276 | 新增: groupNameControl.Text = groupName; | |
| 277 | 新增: groupNameControl.FontSize = 14; | |
| 278 | 新增: groupNameControl.Margin = new Thickness(0, 0, 0, 10); | |
| 279 | 新增: container.Children.Add(groupNameControl); | |
| 280 | 新增: } | |
| 281 | 新增: | |
| 282 | 新增: var border = new Border(); | |
| 283 | 新增: border.Background = new SolidColorBrush(Colors.White); | |
| 284 | 新增: border.CornerRadius = new CornerRadius(6); | |
| 285 | 新增: border.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ededed")); | |
| 286 | 新增: border.BorderThickness = new Thickness(1); | |
| 287 | 新增: border.Child = item; | |
| 288 | 新增: | |
| 289 | 新增: container.Children.Add(border); | |
| 290 | 新增: | |
| 291 | 新增: return container; | |
| 292 | 新增: } | |
| 293 | 新增: | |
| 294 | 新增: | |
| 295 | 新增: private UIElement RenderConfigItem(ConfigAttribute attribute, PropertyInfo pi) | |
| 296 | 新增: { | |
| 297 | 新增: UIElement uIElement = null; | |
| 298 | 新增: if (pi.PropertyType == typeof(bool)) | |
| 299 | 新增: { | |
| 300 | 新增: uIElement = RenderBooleanConfigControl(attribute, pi); | |
| 301 | 新增: } | |
| 302 | 新增: | |
| 303 | 新增: return uIElement; | |
| 304 | 新增: } | |
| 305 | 新增: | |
| 306 | 新增: private UIElement RenderBooleanConfigControl(ConfigAttribute configAttribute, PropertyInfo pi) | |
| 307 | 新增: { | |
| 308 | 新增: var inputControl = new Toggle.Toggle(); | |
| 309 | 新增: inputControl.ToggleChanged += (e, c) => | |
| 310 | 新增: { | |
| 311 | 新增: pi.SetValue(configData, inputControl.IsChecked); | |
| 312 | 新增: | |
| 313 | 新增: Data = configData; | |
| 314 | 新增: }; | |
| 315 | 新增: | |
| 316 | 新增: inputControl.IsChecked = (bool)pi.GetValue(Data); | |
| 317 | 新增: | |
| 318 | 新增: var item = new SettingPanelItem(); | |
| 319 | 新增: item.Name = configAttribute.Name; | |
| 320 | 新增: item.Description = configAttribute.Description; | |
| 321 | 新增: item.Content = inputControl; | |
| 322 | 新增: | |
| 323 | 新增: return item; | |
| 324 | 新增: } | |
| 325 | 新增: } | |
| 326 | 新增:} | |
| @@ -0,0 +1,36 @@ | ||
| 1 | 新增:using Core.Models.Config; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Collections.ObjectModel; | |
| 5 | 新增:using System.Diagnostics; | |
| 6 | 新增:using System.Linq; | |
| 7 | 新增:using System.Reflection; | |
| 8 | 新增:using System.Text; | |
| 9 | 新增:using System.Threading.Tasks; | |
| 10 | 新增:using System.Windows; | |
| 11 | 新增:using System.Windows.Controls; | |
| 12 | 新增: | |
| 13 | 新增:namespace UI.Controls.SettingPanel | |
| 14 | 新增:{ | |
| 15 | 新增: public class SettingPanelItem : Control | |
| 16 | 新增: { | |
| 17 | 新增: /// <summary> | |
| 18 | 新增: /// 描述 | |
| 19 | 新增: /// </summary> | |
| 20 | 新增: public string Description { get { return (string)GetValue(DescriptionProperty); } set { SetValue(DescriptionProperty, value); } } | |
| 21 | 新增: public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(string), typeof(SettingPanelItem)); | |
| 22 | 新增: | |
| 23 | 新增: public object Content { get { return (object)GetValue(ContentProperty); } set { SetValue(ContentProperty, value); } } | |
| 24 | 新增: public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(SettingPanelItem)); | |
| 25 | 新增: | |
| 26 | 新增: public SettingPanelItem() | |
| 27 | 新增: { | |
| 28 | 新增: DefaultStyleKey = typeof(SettingPanelItem); | |
| 29 | 新增: } | |
| 30 | 新增: public override void OnApplyTemplate() | |
| 31 | 新增: { | |
| 32 | 新增: base.OnApplyTemplate(); | |
| 33 | 新增: | |
| 34 | 新增: } | |
| 35 | 新增: } | |
| 36 | 新增:} | |
| @@ -0,0 +1,241 @@ | ||
| 1 | 新增:using Core.Models.Config; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections; | |
| 4 | 新增:using System.Collections.Generic; | |
| 5 | 新增:using System.Collections.ObjectModel; | |
| 6 | 新增:using System.Collections.Specialized; | |
| 7 | 新增:using System.Diagnostics; | |
| 8 | 新增:using System.Linq; | |
| 9 | 新增:using System.Reflection; | |
| 10 | 新增:using System.Text; | |
| 11 | 新增:using System.Threading.Tasks; | |
| 12 | 新增:using System.Windows; | |
| 13 | 新增:using System.Windows.Controls; | |
| 14 | 新增:using UI.Controls.Button; | |
| 15 | 新增:using UI.Controls.Input; | |
| 16 | 新增:using UI.Controls.List; | |
| 17 | 新增: | |
| 18 | 新增:namespace UI.Controls.SettingPanel | |
| 19 | 新增:{ | |
| 20 | 新增: public class SettingPanelMultiItem : Control | |
| 21 | 新增: { | |
| 22 | 新增: public bool Fold { get { return (bool)GetValue(FoldProperty); } set { SetValue(FoldProperty, value); } } | |
| 23 | 新增: public static readonly DependencyProperty FoldProperty = DependencyProperty.Register("Fold", typeof(bool), typeof(SettingPanelMultiItem), new PropertyMetadata(false)); | |
| 24 | 新增: | |
| 25 | 新增: public object Data { get { return (object)GetValue(DataProperty); } set { SetValue(DataProperty, value); } } | |
| 26 | 新增: public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(SettingPanelMultiItem)); | |
| 27 | 新增: | |
| 28 | 新增: public Command OnRemoveAction { get { return (Command)GetValue(OnRemoveActionProperty); } set { SetValue(OnRemoveActionProperty, value); } } | |
| 29 | 新增: public static readonly DependencyProperty OnRemoveActionProperty = DependencyProperty.Register("OnRemoveAction", typeof(Command), typeof(SettingPanelMultiItem)); | |
| 30 | 新增: public Command OnFoldAction { get { return (Command)GetValue(OnFoldActionProperty); } set { SetValue(OnFoldActionProperty, value); } } | |
| 31 | 新增: public static readonly DependencyProperty OnFoldActionProperty = DependencyProperty.Register("OnFoldAction", typeof(Command), typeof(SettingPanelMultiItem)); | |
| 32 | 新增: public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); } } | |
| 33 | 新增: public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(SettingPanelMultiItem)); | |
| 34 | 新增: public event EventHandler DataChanged; | |
| 35 | 新增: | |
| 36 | 新增: private StackPanel Container; | |
| 37 | 新增: private object configData; | |
| 38 | 新增: private IconButton FoldBtn; | |
| 39 | 新增: public SettingPanelMultiItem() | |
| 40 | 新增: { | |
| 41 | 新增: DefaultStyleKey = typeof(SettingPanelMultiItem); | |
| 42 | 新增: } | |
| 43 | 新增: public override void OnApplyTemplate() | |
| 44 | 新增: { | |
| 45 | 新增: base.OnApplyTemplate(); | |
| 46 | 新增: Container = GetTemplateChild("Container") as StackPanel; | |
| 47 | 新增: FoldBtn = GetTemplateChild("FoldBtn") as IconButton; | |
| 48 | 新增: | |
| 49 | 新增: OnFoldAction = new Command(new Action<object>(FoldAction)); | |
| 50 | 新增: Render(); | |
| 51 | 新增: } | |
| 52 | 新增: | |
| 53 | 新增: private void FoldAction(object obj) | |
| 54 | 新增: { | |
| 55 | 新增: Fold = !Fold; | |
| 56 | 新增: if (Fold) | |
| 57 | 新增: { | |
| 58 | 新增: FoldBtn.Icon = Base.IconTypes.ChevronDown; | |
| 59 | 新增: | |
| 60 | 新增: FoldBtn.ToolTip = "展开"; | |
| 61 | 新增: } | |
| 62 | 新增: else | |
| 63 | 新增: { | |
| 64 | 新增: FoldBtn.Icon = Base.IconTypes.ChevronUp; | |
| 65 | 新增: | |
| 66 | 新增: FoldBtn.ToolTip = "收起"; | |
| 67 | 新增: | |
| 68 | 新增: } | |
| 69 | 新增: } | |
| 70 | 新增: | |
| 71 | 新增: private void Render() | |
| 72 | 新增: { | |
| 73 | 新增: if (Container == null) | |
| 74 | 新增: { | |
| 75 | 新增: return; | |
| 76 | 新增: } | |
| 77 | 新增: | |
| 78 | 新增: Container.Children.Clear(); | |
| 79 | 新增: | |
| 80 | 新增: configData = Activator.CreateInstance(Data.GetType()); | |
| 81 | 新增: | |
| 82 | 新增: // 遍历方法特性 | |
| 83 | 新增: foreach (PropertyInfo pi in Data.GetType().GetProperties()) | |
| 84 | 新增: { | |
| 85 | 新增: foreach (Attribute attr in pi.GetCustomAttributes(true)) | |
| 86 | 新增: { | |
| 87 | 新增: if (attr is ConfigAttribute) | |
| 88 | 新增: { | |
| 89 | 新增: ConfigAttribute attribute = (ConfigAttribute)attr; | |
| 90 | 新增: | |
| 91 | 新增: if (pi.PropertyType == typeof(string)) | |
| 92 | 新增: { | |
| 93 | 新增: // 输入框 | |
| 94 | 新增: RenderTextBox(attribute, pi); | |
| 95 | 新增: } | |
| 96 | 新增: else if (pi.PropertyType == typeof(List<string>)) | |
| 97 | 新增: { | |
| 98 | 新增: // String 集合 | |
| 99 | 新增: RenderStringList(attribute, pi); | |
| 100 | 新增: } | |
| 101 | 新增: } | |
| 102 | 新增: } | |
| 103 | 新增: } | |
| 104 | 新增: } | |
| 105 | 新增: | |
| 106 | 新增: private void RenderStringList(ConfigAttribute attribute, PropertyInfo pi) | |
| 107 | 新增: { | |
| 108 | 新增: var title = new SettingPanelItem(); | |
| 109 | 新增: title.Name = attribute.Name; | |
| 110 | 新增: title.Description = attribute.Description; | |
| 111 | 新增: | |
| 112 | 新增: Container.Children.Add(title); | |
| 113 | 新增: | |
| 114 | 新增: var list = pi.GetValue(Data) as List<string>; | |
| 115 | 新增: | |
| 116 | 新增: var listControl = new BaseList(); | |
| 117 | 新增: | |
| 118 | 新增: listControl.Loaded += (sender, args) => | |
| 119 | 新增: { | |
| 120 | 新增: listControl.Items.CollectionChanged += (o, e) => | |
| 121 | 新增: { | |
| 122 | 新增: var newData = new List<string>(); | |
| 123 | 新增: foreach (var item in listControl.Items) | |
| 124 | 新增: { | |
| 125 | 新增: newData.Add(item.ToString()); | |
| 126 | 新增: } | |
| 127 | 新增: pi.SetValue(configData, newData); | |
| 128 | 新增: Data = configData; | |
| 129 | 新增: DataChanged?.Invoke(this, EventArgs.Empty); | |
| 130 | 新增: }; | |
| 131 | 新增: //((INotifyCollectionChanged)listControl.Items).CollectionChanged += (sender2, e) => | |
| 132 | 新增: //{ | |
| 133 | 新增: // var newData = new List<string>(); | |
| 134 | 新增: // foreach (var item in listControl.Items) | |
| 135 | 新增: // { | |
| 136 | 新增: // newData.Add(item.ToString()); | |
| 137 | 新增: // } | |
| 138 | 新增: // pi.SetValue(configData, newData); | |
| 139 | 新增: // Data = configData; | |
| 140 | 新增: // DataChanged?.Invoke(this, EventArgs.Empty); | |
| 141 | 新增: //}; | |
| 142 | 新增: }; | |
| 143 | 新增: listControl.Margin = new Thickness(15, 0, 15, 10); | |
| 144 | 新增: | |
| 145 | 新增: if (list != null) | |
| 146 | 新增: { | |
| 147 | 新增: foreach (string item in list) | |
| 148 | 新增: { | |
| 149 | 新增: listControl.Items.Add(item); | |
| 150 | 新增: } | |
| 151 | 新增: } | |
| 152 | 新增: else | |
| 153 | 新增: { | |
| 154 | 新增: list = new List<string>(); | |
| 155 | 新增: } | |
| 156 | 新增: var contextMenu = new ContextMenu(); | |
| 157 | 新增: | |
| 158 | 新增: var contextMenuItemDel = new MenuItem(); | |
| 159 | 新增: contextMenuItemDel.Header = "移除"; | |
| 160 | 新增: contextMenuItemDel.Click += (e, c) => | |
| 161 | 新增: { | |
| 162 | 新增: listControl.Items.Remove(listControl.SelectedItem); | |
| 163 | 新增: }; | |
| 164 | 新增: contextMenu.Items.Add(contextMenuItemDel); | |
| 165 | 新增: listControl.ContextMenu = contextMenu; | |
| 166 | 新增: | |
| 167 | 新增: | |
| 168 | 新增: var addInputBox = new InputBox(); | |
| 169 | 新增: addInputBox.Placeholder = attribute.Name; | |
| 170 | 新增: addInputBox.Margin = new Thickness(0, 0, 10, 0); | |
| 171 | 新增: | |
| 172 | 新增: var addBtn = new Button.Button(); | |
| 173 | 新增: //addBtn.Margin = new Thickness(15, 0, 15, 10); | |
| 174 | 新增: addBtn.Content = "添加"; | |
| 175 | 新增: | |
| 176 | 新增: addBtn.Click += (e, c) => | |
| 177 | 新增: { | |
| 178 | 新增: if (addInputBox.Text == String.Empty || list.Contains(addInputBox.Text)) | |
| 179 | 新增: { | |
| 180 | 新增: return; | |
| 181 | 新增: } | |
| 182 | 新增: //list.Add(addInputBox.Text); | |
| 183 | 新增: listControl.Items.Add(addInputBox.Text); | |
| 184 | 新增: addInputBox.Text = String.Empty; | |
| 185 | 新增: | |
| 186 | 新增: | |
| 187 | 新增: | |
| 188 | 新增: }; | |
| 189 | 新增: pi.SetValue(configData, list); | |
| 190 | 新增: Container.Children.Add(listControl); | |
| 191 | 新增: | |
| 192 | 新增: var inputPanel = new Grid(); | |
| 193 | 新增: inputPanel.ColumnDefinitions.Add( | |
| 194 | 新增: new ColumnDefinition() | |
| 195 | 新增: { | |
| 196 | 新增: Width = new GridLength(10, GridUnitType.Star) | |
| 197 | 新增: }); | |
| 198 | 新增: inputPanel.ColumnDefinitions.Add( | |
| 199 | 新增: new ColumnDefinition() | |
| 200 | 新增: { | |
| 201 | 新增: Width = new GridLength(2, GridUnitType.Star) | |
| 202 | 新增: }); | |
| 203 | 新增: inputPanel.Margin = new Thickness(15, 10, 15, 10); | |
| 204 | 新增: Grid.SetColumn(addInputBox, 0); | |
| 205 | 新增: Grid.SetColumn(addBtn, 1); | |
| 206 | 新增: inputPanel.Children.Add(addInputBox); | |
| 207 | 新增: inputPanel.Children.Add(addBtn); | |
| 208 | 新增: Container.Children.Add(inputPanel); | |
| 209 | 新增: | |
| 210 | 新增: | |
| 211 | 新增: } | |
| 212 | 新增: private void RenderTextBox(ConfigAttribute attribute, PropertyInfo pi) | |
| 213 | 新增: { | |
| 214 | 新增: | |
| 215 | 新增: var textBox = new InputBox(); | |
| 216 | 新增: textBox.Text = (string)pi.GetValue(Data); | |
| 217 | 新增: textBox.Placeholder = attribute.Name; | |
| 218 | 新增: textBox.Width = 125; | |
| 219 | 新增: textBox.LostFocus += (e, c) => | |
| 220 | 新增: { | |
| 221 | 新增: if (attribute.IsName) | |
| 222 | 新增: { | |
| 223 | 新增: Title = textBox.Text; | |
| 224 | 新增: } | |
| 225 | 新增: pi.SetValue(configData, textBox.Text); | |
| 226 | 新增: Data = configData; | |
| 227 | 新增: DataChanged?.Invoke(this, EventArgs.Empty); | |
| 228 | 新增: }; | |
| 229 | 新增: var item = new SettingPanelItem(); | |
| 230 | 新增: item.Name = attribute.Name; | |
| 231 | 新增: item.Description = attribute.Description; | |
| 232 | 新增: item.Content = textBox; | |
| 233 | 新增: pi.SetValue(configData, textBox.Text); | |
| 234 | 新增: if (attribute.IsName) | |
| 235 | 新增: { | |
| 236 | 新增: Title = textBox.Text; | |
| 237 | 新增: } | |
| 238 | 新增: Container.Children.Add(item); | |
| 239 | 新增: } | |
| 240 | 新增: } | |
| 241 | 新增:} | |
| @@ -0,0 +1,299 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Collections.ObjectModel; | |
| 4 | 新增:using System.Collections.Specialized; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Windows; | |
| 8 | 新增:using System.Windows.Controls; | |
| 9 | 新增:using System.Windows.Input; | |
| 10 | 新增:using System.Windows.Media; | |
| 11 | 新增:using System.Windows.Media.Animation; | |
| 12 | 新增:using UI.Controls.Navigation.Models; | |
| 13 | 新增: | |
| 14 | 新增:namespace UI.Controls.Tabbar | |
| 15 | 新增:{ | |
| 16 | 新增: public class Tabbar : Control | |
| 17 | 新增: { | |
| 18 | 新增: | |
| 19 | 新增: | |
| 20 | 新增: public int SelectedIndex | |
| 21 | 新增: { | |
| 22 | 新增: get { return (int)GetValue(SelectedIndexProperty); } | |
| 23 | 新增: set { SetValue(SelectedIndexProperty, value); } | |
| 24 | 新增: } | |
| 25 | 新增: public static readonly DependencyProperty SelectedIndexProperty = | |
| 26 | 新增: DependencyProperty.Register("SelectedIndex", typeof(int), typeof(Tabbar), new PropertyMetadata((int)0, new PropertyChangedCallback(OnSelectedItemChanged))); | |
| 27 | 新增: | |
| 28 | 新增: private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
| 29 | 新增: { | |
| 30 | 新增: var control = d as Tabbar; | |
| 31 | 新增: if (e.NewValue != e.OldValue) | |
| 32 | 新增: { | |
| 33 | 新增: control.ScrollToActive(int.Parse(e.OldValue.ToString())); | |
| 34 | 新增: } | |
| 35 | 新增: } | |
| 36 | 新增: | |
| 37 | 新增: | |
| 38 | 新增: public ObservableCollection<string> Data | |
| 39 | 新增: { | |
| 40 | 新增: get | |
| 41 | 新增: { | |
| 42 | 新增: return (ObservableCollection<string>)GetValue(DataProperty); | |
| 43 | 新增: } | |
| 44 | 新增: set | |
| 45 | 新增: { | |
| 46 | 新增: SetValue(DataProperty, value); | |
| 47 | 新增: } | |
| 48 | 新增: } | |
| 49 | 新增: public static readonly DependencyProperty DataProperty = | |
| 50 | 新增: DependencyProperty.Register("Data", typeof(ObservableCollection<string>), typeof(Tabbar), new PropertyMetadata(new PropertyChangedCallback(OnDataChanged))); | |
| 51 | 新增: | |
| 52 | 新增: private static void OnDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
| 53 | 新增: { | |
| 54 | 新增: var control = d as Tabbar; | |
| 55 | 新增: if (e.NewValue != e.OldValue) | |
| 56 | 新增: { | |
| 57 | 新增: | |
| 58 | 新增: } | |
| 59 | 新增: } | |
| 60 | 新增: | |
| 61 | 新增: | |
| 62 | 新增: private StackPanel ItemsPanel; | |
| 63 | 新增: private List<TextBlock> ItemsDictionary; | |
| 64 | 新增: | |
| 65 | 新增: // 选中标记块 | |
| 66 | 新增: private Border ActiveBlock; | |
| 67 | 新增: // 动画 | |
| 68 | 新增: Storyboard storyboard; | |
| 69 | 新增: public Tabbar() | |
| 70 | 新增: { | |
| 71 | 新增: DefaultStyleKey = typeof(Tabbar); | |
| 72 | 新增: ItemsDictionary = new List<TextBlock>(); | |
| 73 | 新增: storyboard = new Storyboard(); | |
| 74 | 新增: } | |
| 75 | 新增: | |
| 76 | 新增: private void Data_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) | |
| 77 | 新增: { | |
| 78 | 新增: //if (e.Action == NotifyCollectionChangedAction.Add) | |
| 79 | 新增: //{ | |
| 80 | 新增: // foreach (var item in e.NewItems) | |
| 81 | 新增: // { | |
| 82 | 新增: // AddItem(item as NavigationItemModel); | |
| 83 | 新增: // } | |
| 84 | 新增: //} | |
| 85 | 新增: //if (e.Action == NotifyCollectionChangedAction.Remove) | |
| 86 | 新增: //{ | |
| 87 | 新增: // foreach (var item in e.OldItems) | |
| 88 | 新增: // { | |
| 89 | 新增: // RemoveItem(item as NavigationItemModel); | |
| 90 | 新增: // } | |
| 91 | 新增: //} | |
| 92 | 新增: //if (e.Action == NotifyCollectionChangedAction.Replace) | |
| 93 | 新增: //{ | |
| 94 | 新增: // foreach (var ritem in e.NewItems) | |
| 95 | 新增: // { | |
| 96 | 新增: // var item = ritem as NavigationItemModel; | |
| 97 | 新增: // var id = item.ID; | |
| 98 | 新增: // ItemsDictionary[id].Icon = item.Icon; | |
| 99 | 新增: // ItemsDictionary[id].Title = item.Title; | |
| 100 | 新增: | |
| 101 | 新增: // } | |
| 102 | 新增: //} | |
| 103 | 新增: } | |
| 104 | 新增: | |
| 105 | 新增: public override void OnApplyTemplate() | |
| 106 | 新增: { | |
| 107 | 新增: base.OnApplyTemplate(); | |
| 108 | 新增: ItemsPanel = GetTemplateChild("ItemsPanel") as StackPanel; | |
| 109 | 新增: ActiveBlock = GetTemplateChild("ActiveBlock") as Border; | |
| 110 | 新增: | |
| 111 | 新增: Render(); | |
| 112 | 新增: } | |
| 113 | 新增: | |
| 114 | 新增: | |
| 115 | 新增: private void AddItem(string item) | |
| 116 | 新增: { | |
| 117 | 新增: if (ItemsPanel != null) | |
| 118 | 新增: { | |
| 119 | 新增: var control = new TextBlock(); | |
| 120 | 新增: control.Text = item; | |
| 121 | 新增: control.Margin = new Thickness(0, 0, 10, 0); | |
| 122 | 新增: control.FontSize = 18; | |
| 123 | 新增: control.Cursor = Cursors.Hand; | |
| 124 | 新增: control.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1F1F1F")); | |
| 125 | 新增: control.VerticalAlignment = VerticalAlignment.Bottom; | |
| 126 | 新增: control.MouseUp += (e, c) => | |
| 127 | 新增: { | |
| 128 | 新增: int index = Data.IndexOf(item); | |
| 129 | 新增: if (SelectedIndex != index) | |
| 130 | 新增: { | |
| 131 | 新增: SelectedIndex = index; | |
| 132 | 新增: } | |
| 133 | 新增: }; | |
| 134 | 新增: if (Data.IndexOf(item) == Data.Count - 1) | |
| 135 | 新增: { | |
| 136 | 新增: control.Loaded += (e, c) => | |
| 137 | 新增: { | |
| 138 | 新增: ScrollToActive(); | |
| 139 | 新增: Reset(); | |
| 140 | 新增: }; | |
| 141 | 新增: } | |
| 142 | 新增: ItemsPanel.Children.Add(control); | |
| 143 | 新增: ItemsDictionary.Add(control); | |
| 144 | 新增: } | |
| 145 | 新增: } | |
| 146 | 新增: | |
| 147 | 新增: | |
| 148 | 新增: | |
| 149 | 新增: private void Render() | |
| 150 | 新增: { | |
| 151 | 新增: if (Data != null) | |
| 152 | 新增: { | |
| 153 | 新增: ItemsPanel.Children.Clear(); | |
| 154 | 新增: foreach (var item in Data) | |
| 155 | 新增: { | |
| 156 | 新增: AddItem(item); | |
| 157 | 新增: } | |
| 158 | 新增: | |
| 159 | 新增: } | |
| 160 | 新增: } | |
| 161 | 新增: | |
| 162 | 新增: private void ScrollToActive(int oldSelectedIndex = 0) | |
| 163 | 新增: { | |
| 164 | 新增: if (oldSelectedIndex > ItemsDictionary.Count || ItemsDictionary.Count == 0) | |
| 165 | 新增: { | |
| 166 | 新增: return; | |
| 167 | 新增: } | |
| 168 | 新增: // 获取选中项 | |
| 169 | 新增: | |
| 170 | 新增: var item = ItemsDictionary[SelectedIndex]; | |
| 171 | 新增: var oldSelectedItem = ItemsDictionary[oldSelectedIndex]; | |
| 172 | 新增: | |
| 173 | 新增: //ActiveBlock.Height = item.ActualHeight * Data.Count; | |
| 174 | 新增: | |
| 175 | 新增: // 选中项的坐标 | |
| 176 | 新增: Point relativePoint = item.TransformToAncestor(this).Transform(new Point(0, 0)); | |
| 177 | 新增: | |
| 178 | 新增: // 创建动画 | |
| 179 | 新增: | |
| 180 | 新增: // 设定动画方向 | |
| 181 | 新增: //var activeBlockTTF = (ActiveBlock.RenderTransform as TransformGroup).Children[0] as TranslateTransform; | |
| 182 | 新增: | |
| 183 | 新增: //var transformGroup = new TransformGroup(); | |
| 184 | 新增: //transformGroup.Children.Add(new TranslateTransform(0, activeBlockTTF.Y)); | |
| 185 | 新增: //transformGroup.Children.Add(new ScaleTransform(1, 1, 0, 0)); | |
| 186 | 新增: | |
| 187 | 新增: //ActiveBlock.RenderTransform = transformGroup; | |
| 188 | 新增: | |
| 189 | 新增: | |
| 190 | 新增: storyboard.Children.Clear(); | |
| 191 | 新增: DoubleAnimation scrollAnimation = new DoubleAnimation(); | |
| 192 | 新增: //scrollAnimation.From = activeBlockTTF.Y; | |
| 193 | 新增: double scrollX = relativePoint.X - 10; | |
| 194 | 新增: scrollX = scrollX < 0 ? 0 : scrollX; | |
| 195 | 新增: scrollAnimation.To = scrollX; | |
| 196 | 新增: | |
| 197 | 新增: scrollAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 198 | 新增: Storyboard.SetTarget(scrollAnimation, ActiveBlock); | |
| 199 | 新增: Storyboard.SetTargetProperty(scrollAnimation, new PropertyPath("RenderTransform.Children[0].X")); | |
| 200 | 新增: | |
| 201 | 新增: scrollAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.15)); | |
| 202 | 新增: | |
| 203 | 新增: // 文字大小动画 | |
| 204 | 新增: DoubleAnimation fontSizeAnimation = new DoubleAnimation(); | |
| 205 | 新增: //scrollAnimation.From = activeBlockTTF.Y; | |
| 206 | 新增: fontSizeAnimation.To = 18; | |
| 207 | 新增: | |
| 208 | 新增: fontSizeAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 209 | 新增: Storyboard.SetTarget(fontSizeAnimation, item); | |
| 210 | 新增: Storyboard.SetTargetProperty(fontSizeAnimation, new PropertyPath("FontSize")); | |
| 211 | 新增: | |
| 212 | 新增: fontSizeAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.1)); | |
| 213 | 新增: | |
| 214 | 新增: | |
| 215 | 新增: | |
| 216 | 新增: // 文字颜色动画 | |
| 217 | 新增: ColorAnimation fontColorAnimation = new ColorAnimation(); | |
| 218 | 新增: //scrollAnimation.From = activeBlockTTF.Y; | |
| 219 | 新增: fontColorAnimation.To = (Color)ColorConverter.ConvertFromString("#2b20d9"); | |
| 220 | 新增: | |
| 221 | 新增: fontColorAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 222 | 新增: Storyboard.SetTarget(fontColorAnimation, item); | |
| 223 | 新增: Storyboard.SetTargetProperty(fontColorAnimation, new PropertyPath("(TextBlock.Foreground).(SolidColorBrush.Color)")); | |
| 224 | 新增: | |
| 225 | 新增: fontColorAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.1)); | |
| 226 | 新增: | |
| 227 | 新增: | |
| 228 | 新增: storyboard.Children.Add(scrollAnimation); | |
| 229 | 新增: storyboard.Children.Add(fontSizeAnimation); | |
| 230 | 新增: | |
| 231 | 新增: storyboard.Children.Add(fontColorAnimation); | |
| 232 | 新增: | |
| 233 | 新增: | |
| 234 | 新增: if (oldSelectedIndex != SelectedIndex) | |
| 235 | 新增: { | |
| 236 | 新增: DoubleAnimation oldFontSizeAnimation = new DoubleAnimation(); | |
| 237 | 新增: //scrollAnimation.From = activeBlockTTF.Y; | |
| 238 | 新增: oldFontSizeAnimation.To = 14; | |
| 239 | 新增: | |
| 240 | 新增: oldFontSizeAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 241 | 新增: Storyboard.SetTarget(oldFontSizeAnimation, oldSelectedItem); | |
| 242 | 新增: Storyboard.SetTargetProperty(oldFontSizeAnimation, new PropertyPath("FontSize")); | |
| 243 | 新增: | |
| 244 | 新增: oldFontSizeAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.1)); | |
| 245 | 新增: | |
| 246 | 新增: ColorAnimation oldFontColorAnimation = new ColorAnimation(); | |
| 247 | 新增: //scrollAnimation.From = activeBlockTTF.Y; | |
| 248 | 新增: oldFontColorAnimation.To = (Color)ColorConverter.ConvertFromString("#CCCCCC"); | |
| 249 | 新增: | |
| 250 | 新增: oldFontColorAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 251 | 新增: Storyboard.SetTarget(oldFontColorAnimation, oldSelectedItem); | |
| 252 | 新增: Storyboard.SetTargetProperty(oldFontColorAnimation, new PropertyPath("(TextBlock.Foreground).(SolidColorBrush.Color)")); | |
| 253 | 新增: | |
| 254 | 新增: oldFontColorAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.3)); | |
| 255 | 新增: | |
| 256 | 新增: storyboard.Children.Add(oldFontSizeAnimation); | |
| 257 | 新增: storyboard.Children.Add(oldFontColorAnimation); | |
| 258 | 新增: | |
| 259 | 新增: } | |
| 260 | 新增: storyboard.Begin(); | |
| 261 | 新增: } | |
| 262 | 新增: | |
| 263 | 新增: private void Reset() | |
| 264 | 新增: { | |
| 265 | 新增: Storyboard storyboard = new Storyboard(); | |
| 266 | 新增: | |
| 267 | 新增: foreach (var item in ItemsPanel.Children) | |
| 268 | 新增: { | |
| 269 | 新增: if (item != ItemsPanel.Children[SelectedIndex]) | |
| 270 | 新增: { | |
| 271 | 新增: DoubleAnimation fontSizeAnimation = new DoubleAnimation(); | |
| 272 | 新增: //scrollAnimation.From = activeBlockTTF.Y; | |
| 273 | 新增: fontSizeAnimation.To = 14; | |
| 274 | 新增: | |
| 275 | 新增: fontSizeAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 276 | 新增: Storyboard.SetTarget(fontSizeAnimation, (UIElement)item); | |
| 277 | 新增: Storyboard.SetTargetProperty(fontSizeAnimation, new PropertyPath("FontSize")); | |
| 278 | 新增: | |
| 279 | 新增: fontSizeAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.1)); | |
| 280 | 新增: | |
| 281 | 新增: ColorAnimation oldFontColorAnimation = new ColorAnimation(); | |
| 282 | 新增: //scrollAnimation.From = activeBlockTTF.Y; | |
| 283 | 新增: oldFontColorAnimation.To = (Color)ColorConverter.ConvertFromString("#CCCCCC"); | |
| 284 | 新增: | |
| 285 | 新增: oldFontColorAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 286 | 新增: Storyboard.SetTarget(oldFontColorAnimation, (UIElement)item); | |
| 287 | 新增: Storyboard.SetTargetProperty(oldFontColorAnimation, new PropertyPath("(TextBlock.Foreground).(SolidColorBrush.Color)")); | |
| 288 | 新增: | |
| 289 | 新增: oldFontColorAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.3)); | |
| 290 | 新增: | |
| 291 | 新增: storyboard.Children.Add(fontSizeAnimation); | |
| 292 | 新增: storyboard.Children.Add(oldFontColorAnimation); | |
| 293 | 新增: } | |
| 294 | 新增: } | |
| 295 | 新增: | |
| 296 | 新增: storyboard.Begin(); | |
| 297 | 新增: } | |
| 298 | 新增: } | |
| 299 | 新增:} | |
| @@ -0,0 +1,72 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增:using System.Windows.Input; | |
| 9 | 新增: | |
| 10 | 新增:namespace UI.Controls.Toggle | |
| 11 | 新增:{ | |
| 12 | 新增: public class Toggle : Control | |
| 13 | 新增: { | |
| 14 | 新增: public event EventHandler ToggleChanged; | |
| 15 | 新增: public bool IsChecked | |
| 16 | 新增: { | |
| 17 | 新增: get { return (bool)GetValue(IsCheckedProperty); } | |
| 18 | 新增: set { SetValue(IsCheckedProperty, value); } | |
| 19 | 新增: } | |
| 20 | 新增: public static readonly DependencyProperty IsCheckedProperty = | |
| 21 | 新增: DependencyProperty.Register("IsChecked", typeof(bool), typeof(Toggle), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnIsCheckedChanged))); | |
| 22 | 新增: | |
| 23 | 新增: private static void OnIsCheckedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |
| 24 | 新增: { | |
| 25 | 新增: var control = d as Toggle; | |
| 26 | 新增: if (e.OldValue != e.NewValue) | |
| 27 | 新增: { | |
| 28 | 新增: control.Text = control.IsChecked ? control.OnText : control.OffText; | |
| 29 | 新增: } | |
| 30 | 新增: VisualStateManager.GoToState(control, control.IsChecked ? "On" : "Off", true); | |
| 31 | 新增: } | |
| 32 | 新增: | |
| 33 | 新增: public string OnText | |
| 34 | 新增: { | |
| 35 | 新增: get { return (string)GetValue(OnTextProperty); } | |
| 36 | 新增: set { SetValue(OnTextProperty, value); } | |
| 37 | 新增: } | |
| 38 | 新增: public static readonly DependencyProperty OnTextProperty = | |
| 39 | 新增: DependencyProperty.Register("OnText", typeof(string), typeof(Toggle), new PropertyMetadata("开")); | |
| 40 | 新增: public string OffText | |
| 41 | 新增: { | |
| 42 | 新增: get { return (string)GetValue(OffTextProperty); } | |
| 43 | 新增: set { SetValue(OffTextProperty, value); } | |
| 44 | 新增: } | |
| 45 | 新增: public static readonly DependencyProperty OffTextProperty = | |
| 46 | 新增: DependencyProperty.Register("OffText", typeof(string), typeof(Toggle), new PropertyMetadata("关")); | |
| 47 | 新增: public string Text | |
| 48 | 新增: { | |
| 49 | 新增: get { return (string)GetValue(TextProperty); } | |
| 50 | 新增: set { SetValue(TextProperty, value); } | |
| 51 | 新增: } | |
| 52 | 新增: public static readonly DependencyProperty TextProperty = | |
| 53 | 新增: DependencyProperty.Register("Text", typeof(string), typeof(Toggle), new PropertyMetadata("关")); | |
| 54 | 新增: | |
| 55 | 新增: public Toggle() | |
| 56 | 新增: { | |
| 57 | 新增: DefaultStyleKey = typeof(Toggle); | |
| 58 | 新增: } | |
| 59 | 新增: public override void OnApplyTemplate() | |
| 60 | 新增: { | |
| 61 | 新增: base.OnApplyTemplate(); | |
| 62 | 新增: VisualStateManager.GoToState(this, IsChecked ? "On" : "Off", true); | |
| 63 | 新增: } | |
| 64 | 新增: protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) | |
| 65 | 新增: { | |
| 66 | 新增: base.OnMouseLeftButtonUp(e); | |
| 67 | 新增: IsChecked = !IsChecked; | |
| 68 | 新增: ToggleChanged?.Invoke(this, EventArgs.Empty); | |
| 69 | 新增: VisualStateManager.GoToState(this, IsChecked ? "On" : "Off", true); | |
| 70 | 新增: } | |
| 71 | 新增: } | |
| 72 | 新增:} | |
| @@ -90,6 +90,12 @@ namespace UI.Controls.Window | ||
| 90 | 90 | #endregion |
| 91 | 91 | #endregion |
| 92 | 92 | |
| 93 | 新增: private bool IsWindowClosed_ = false; | |
| 94 | 新增: /// <summary> | |
| 95 | 新增: /// 指示当前窗口是否已被关闭 | |
| 96 | 新增: /// </summary> | |
| 97 | 新增: public bool IsWindowClosed { get { return IsWindowClosed_; } } | |
| 98 | 新增: | |
| 93 | 99 | #region 3.初始化 |
| 94 | 100 | public DefaultWindow() |
| 95 | 101 | { |
| @@ -177,6 +183,11 @@ namespace UI.Controls.Window | ||
| 177 | 183 | } |
| 178 | 184 | #endregion |
| 179 | 185 | |
| 186 | 新增: protected override void OnClosed(EventArgs e) | |
| 187 | 新增: { | |
| 188 | 新增: base.OnClosed(e); | |
| 189 | 新增: IsWindowClosed_ = true; | |
| 190 | 新增: } | |
| 180 | 191 | #region 5.命令 |
| 181 | 192 | |
| 182 | 193 | private void OnCloseWindowCommand(object sender, ExecutedRoutedEventArgs e) |
| @@ -0,0 +1,39 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增: | |
| 8 | 新增:namespace UI.Extensions | |
| 9 | 新增:{ | |
| 10 | 新增: public static class ThreadSafeRandom | |
| 11 | 新增: { | |
| 12 | 新增: [ThreadStatic] private static Random Local; | |
| 13 | 新增: | |
| 14 | 新增: public static Random ThisThreadsRandom | |
| 15 | 新增: { | |
| 16 | 新增: get { return Local ?? (Local = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId))); } | |
| 17 | 新增: } | |
| 18 | 新增: } | |
| 19 | 新增: public static class ListExtensions | |
| 20 | 新增: { | |
| 21 | 新增: /// <summary> | |
| 22 | 新增: /// 随机打乱该List | |
| 23 | 新增: /// </summary> | |
| 24 | 新增: /// <typeparam name="T"></typeparam> | |
| 25 | 新增: /// <param name="list"></param> | |
| 26 | 新增: public static void Shuffle<T>(this IList<T> list) | |
| 27 | 新增: { | |
| 28 | 新增: int n = list.Count; | |
| 29 | 新增: while (n > 1) | |
| 30 | 新增: { | |
| 31 | 新增: n--; | |
| 32 | 新增: int k = ThreadSafeRandom.ThisThreadsRandom.Next(n + 1); | |
| 33 | 新增: T value = list[k]; | |
| 34 | 新增: list[k] = list[n]; | |
| 35 | 新增: list[n] = value; | |
| 36 | 新增: } | |
| 37 | 新增: } | |
| 38 | 新增: } | |
| 39 | 新增:} | |
| @@ -0,0 +1,58 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Drawing; | |
| 4 | 新增:using System.IO; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增:using System.Windows; | |
| 9 | 新增:using System.Windows.Interop; | |
| 10 | 新增:using System.Windows.Media; | |
| 11 | 新增:using System.Windows.Media.Imaging; | |
| 12 | 新增:using System.Windows.Resources; | |
| 13 | 新增: | |
| 14 | 新增:namespace Core.Librarys.Image | |
| 15 | 新增:{ | |
| 16 | 新增: public class Imager | |
| 17 | 新增: { | |
| 18 | 新增: public static BitmapImage Load(string filePath) | |
| 19 | 新增: { | |
| 20 | 新增: if (filePath == null) | |
| 21 | 新增: { | |
| 22 | 新增: return null; | |
| 23 | 新增: } | |
| 24 | 新增: | |
| 25 | 新增: var bitmap = new BitmapImage(); | |
| 26 | 新增: bitmap.BeginInit(); | |
| 27 | 新增: if (filePath.IndexOf("pack://") != -1) | |
| 28 | 新增: { | |
| 29 | 新增: StreamResourceInfo info = Application.GetResourceStream(new Uri(filePath, UriKind.RelativeOrAbsolute)); | |
| 30 | 新增: using (var st = info.Stream) | |
| 31 | 新增: { | |
| 32 | 新增: bitmap.StreamSource = st; | |
| 33 | 新增: bitmap.EndInit(); | |
| 34 | 新增: bitmap.Freeze(); | |
| 35 | 新增: } | |
| 36 | 新增: } | |
| 37 | 新增: else | |
| 38 | 新增: { | |
| 39 | 新增: if (!File.Exists(filePath)) | |
| 40 | 新增: { | |
| 41 | 新增: return null; | |
| 42 | 新增: } | |
| 43 | 新增: byte[] imageData; | |
| 44 | 新增: using (var fileStream = new FileStream(@filePath, FileMode.Open, FileAccess.Read)) | |
| 45 | 新增: | |
| 46 | 新增: using (var binaryReader = new BinaryReader(fileStream)) | |
| 47 | 新增: { | |
| 48 | 新增: imageData = binaryReader.ReadBytes((int)fileStream.Length); | |
| 49 | 新增: bitmap.StreamSource = new MemoryStream(imageData); | |
| 50 | 新增: bitmap.EndInit(); | |
| 51 | 新增: bitmap.Freeze(); | |
| 52 | 新增: } | |
| 53 | 新增: } | |
| 54 | 新增: | |
| 55 | 新增: return bitmap; | |
| 56 | 新增: } | |
| 57 | 新增: } | |
| 58 | 新增:} | |
| @@ -0,0 +1,37 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增: | |
| 7 | 新增:namespace UI.Librays | |
| 8 | 新增:{ | |
| 9 | 新增: public class Timer | |
| 10 | 新增: { | |
| 11 | 新增: public static string Fromat(int seconds) | |
| 12 | 新增: { | |
| 13 | 新增: if (seconds < 60) | |
| 14 | 新增: { | |
| 15 | 新增: return seconds + "秒"; | |
| 16 | 新增: } | |
| 17 | 新增: else | |
| 18 | 新增: { | |
| 19 | 新增: double minutes = seconds / 60; | |
| 20 | 新增: if (minutes < 60) | |
| 21 | 新增: { | |
| 22 | 新增: return minutes + "分钟"; | |
| 23 | 新增: } | |
| 24 | 新增: else | |
| 25 | 新增: { | |
| 26 | 新增: double hours = (double)seconds / 60; | |
| 27 | 新增: if (hours != (int)hours) | |
| 28 | 新增: { | |
| 29 | 新增: double pointNumber = hours - (int)hours; | |
| 30 | 新增: return (int)hours + "小时" + (int)(pointNumber * 60) + "分"; | |
| 31 | 新增: } | |
| 32 | 新增: return hours + "小时"; | |
| 33 | 新增: } | |
| 34 | 新增: } | |
| 35 | 新增: } | |
| 36 | 新增: } | |
| 37 | 新增:} | |
| @@ -6,7 +6,7 @@ | ||
| 6 | 6 | xmlns:local="clr-namespace:UI" |
| 7 | 7 | mc:Ignorable="d" |
| 8 | 8 | xmlns:ui="clr-namespace:UI.Controls.Window" |
| 9 | 删除: Title="Tai - 时间管家" Height="450" Width="800" | |
| 9 | 新增: Title="Tai" Height="585" Width="814" MinHeight="585" MinWidth="814" | |
| 10 | 10 | xmlns:control="clr-namespace:UI.Controls" |
| 11 | 11 | xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" |
| 12 | 12 | xmlns:Navigation="clr-namespace:UI.Controls.Navigation" |
| @@ -31,21 +31,15 @@ | ||
| 31 | 31 | <TextBlock Text="test"/> |
| 32 | 32 | </Navigation:Navigation.TopExtContent>--> |
| 33 | 33 | <Navigation:Navigation.BottomExtContent> |
| 34 | 删除: <Navigation:NavigationItem Icon="Settings" Title="设置" Uri="SettingsPage" Command="{Binding GotoPageCommand}" CommandParameter="SettingsPage"/> | |
| 34 | 新增: <Navigation:NavigationItem Icon="Settings" Title="设置" Uri="SettingsPage" Command="{Binding GotoPageCommand}" CommandParameter="SettingPage"/> | |
| 35 | 35 | </Navigation:Navigation.BottomExtContent> |
| 36 | 删除: <Navigation:Navigation.ContextMenu> | |
| 37 | 删除: <ContextMenu> | |
| 38 | 删除: <MenuItem Header="新建分组" Command="{Binding ShowGroupModalCommand}"> | |
| 39 | 删除: <!--<MenuItem.Icon> | |
| 40 | 删除: <base:Icon IconType="CalculatorAddition" FontSize="12"/> | |
| 41 | 删除: </MenuItem.Icon>--> | |
| 42 | 删除: </MenuItem> | |
| 43 | 删除: </ContextMenu> | |
| 44 | 删除: </Navigation:Navigation.ContextMenu> | |
| 36 | 新增: | |
| 45 | 37 | </Navigation:Navigation> |
| 46 | 38 | |
| 47 | 39 | <Border Grid.Column="1" Background="#f9f9f9" Margin="0,40,10,10" CornerRadius="5" BorderThickness="1,1,1,1" BorderBrush="#ccc"> |
| 40 | 新增: <ScrollViewer VerticalScrollBarVisibility="Auto"> | |
| 48 | 41 | <control:PageContainer ServiceProvider="{Binding ServiceProvider}" Uri="{Binding Uri,Mode=TwoWay}" Title="{Binding Title}" IsShowTilteBar="{Binding IsShowTitleBar,Mode=TwoWay}"/> |
| 42 | 新增: </ScrollViewer> | |
| 49 | 43 | </Border> |
| 50 | 44 | |
| 51 | 45 | </Grid> |
| @@ -0,0 +1,33 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Collections.ObjectModel; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Text; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增:using UI.Controls.Charts.Model; | |
| 8 | 新增: | |
| 9 | 新增:namespace UI.Models | |
| 10 | 新增:{ | |
| 11 | 新增: public class DataPageModel : UINotifyPropertyChanged | |
| 12 | 新增: { | |
| 13 | 新增: private List<ChartsDataModel> Data_; | |
| 14 | 新增: /// <summary> | |
| 15 | 新增: /// data | |
| 16 | 新增: /// </summary> | |
| 17 | 新增: public List<ChartsDataModel> Data | |
| 18 | 新增: { | |
| 19 | 新增: get { return Data_; } | |
| 20 | 新增: set { Data_ = value; OnPropertyChanged(); } | |
| 21 | 新增: } | |
| 22 | 新增: | |
| 23 | 新增: private DateTime Date_; | |
| 24 | 新增: /// <summary> | |
| 25 | 新增: /// date | |
| 26 | 新增: /// </summary> | |
| 27 | 新增: public DateTime Date | |
| 28 | 新增: { | |
| 29 | 新增: get { return Date_; } | |
| 30 | 新增: set { Date_ = value; OnPropertyChanged(); } | |
| 31 | 新增: } | |
| 32 | 新增: } | |
| 33 | 新增:} | |
| @@ -0,0 +1,44 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Collections.ObjectModel; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Text; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增:using UI.Controls.Charts.Model; | |
| 8 | 新增: | |
| 9 | 新增:namespace UI.Models | |
| 10 | 新增:{ | |
| 11 | 新增: public class DetailPageModel : UINotifyPropertyChanged | |
| 12 | 新增: { | |
| 13 | 新增: | |
| 14 | 新增: private List<ChartsDataModel> Data_; | |
| 15 | 新增: /// <summary> | |
| 16 | 新增: /// data | |
| 17 | 新增: /// </summary> | |
| 18 | 新增: public List<ChartsDataModel> Data | |
| 19 | 新增: { | |
| 20 | 新增: get { return Data_; } | |
| 21 | 新增: set { Data_ = value; OnPropertyChanged(); } | |
| 22 | 新增: } | |
| 23 | 新增: private ChartsDataModel Process_; | |
| 24 | 新增: public ChartsDataModel Process { get { return Process_; } set { Process_ = value; OnPropertyChanged(); } } | |
| 25 | 新增: private bool IsLoading_; | |
| 26 | 新增: public bool IsLoading { get { return IsLoading_; } set { IsLoading_ = value; OnPropertyChanged(); } } | |
| 27 | 新增: | |
| 28 | 新增: private string Total_; | |
| 29 | 新增: public string Total { get { return Total_; } set { Total_ = value; OnPropertyChanged(); } } | |
| 30 | 新增: | |
| 31 | 新增: private string Ratio_; | |
| 32 | 新增: public string Ratio { get { return Ratio_; } set { Ratio_ = value; OnPropertyChanged(); } } | |
| 33 | 新增: | |
| 34 | 新增: private DateTime Date_; | |
| 35 | 新增: public DateTime Date { get { return Date_; } set { Date_ = value; OnPropertyChanged();} } | |
| 36 | 新增: | |
| 37 | 新增: private string LongDay_; | |
| 38 | 新增: public string LongDay { get { return LongDay_; } set { LongDay_ = value;OnPropertyChanged();} } | |
| 39 | 新增: | |
| 40 | 新增: private string ProcessName_; | |
| 41 | 新增: public string ProcessName { get { return ProcessName_; } set { ProcessName_ = value; OnPropertyChanged(); } } | |
| 42 | 新增: | |
| 43 | 新增: } | |
| 44 | 新增:} | |
| @@ -0,0 +1,51 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Collections.ObjectModel; | |
| 4 | 新增:using System.Linq; | |
| 5 | 新增:using System.Text; | |
| 6 | 新增:using System.Threading.Tasks; | |
| 7 | 新增:using UI.Controls.Charts.Model; | |
| 8 | 新增: | |
| 9 | 新增:namespace UI.Models | |
| 10 | 新增:{ | |
| 11 | 新增: public class IndexPageModel : UINotifyPropertyChanged | |
| 12 | 新增: { | |
| 13 | 新增: private ObservableCollection<string> TabbarData_; | |
| 14 | 新增: /// <summary> | |
| 15 | 新增: /// tabbar data | |
| 16 | 新增: /// </summary> | |
| 17 | 新增: public ObservableCollection<string> TabbarData | |
| 18 | 新增: { | |
| 19 | 新增: get { return TabbarData_; } | |
| 20 | 新增: set { TabbarData_ = value; OnPropertyChanged(); } | |
| 21 | 新增: } | |
| 22 | 新增: | |
| 23 | 新增: private int TabbarSelectedIndex_; | |
| 24 | 新增: /// <summary> | |
| 25 | 新增: /// tabbar selected item index | |
| 26 | 新增: /// </summary> | |
| 27 | 新增: public int TabbarSelectedIndex | |
| 28 | 新增: { | |
| 29 | 新增: get { return TabbarSelectedIndex_; } | |
| 30 | 新增: set | |
| 31 | 新增: { | |
| 32 | 新增: TabbarSelectedIndex_ = value; | |
| 33 | 新增: OnPropertyChanged(); | |
| 34 | 新增: } | |
| 35 | 新增: } | |
| 36 | 新增: | |
| 37 | 新增: | |
| 38 | 新增: private List<ChartsDataModel> WeekData_; | |
| 39 | 新增: /// <summary> | |
| 40 | 新增: /// week data | |
| 41 | 新增: /// </summary> | |
| 42 | 新增: public List<ChartsDataModel> WeekData | |
| 43 | 新增: { | |
| 44 | 新增: get { return WeekData_; } | |
| 45 | 新增: set { WeekData_ = value; OnPropertyChanged(); } | |
| 46 | 新增: } | |
| 47 | 新增: | |
| 48 | 新增: private bool IsLoading_; | |
| 49 | 新增: public bool IsLoading { get { return IsLoading_; } set { IsLoading_ = value; OnPropertyChanged(); } } | |
| 50 | 新增: } | |
| 51 | 新增:} | |
| @@ -0,0 +1,35 @@ | ||
| 1 | 新增:using Core.Models.Config; | |
| 2 | 新增:using System; | |
| 3 | 新增:using System.Collections.Generic; | |
| 4 | 新增:using System.Collections.ObjectModel; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增: | |
| 9 | 新增:namespace UI.Models | |
| 10 | 新增:{ | |
| 11 | 新增: public class SettingPageModel : UINotifyPropertyChanged | |
| 12 | 新增: { | |
| 13 | 新增: private object data; | |
| 14 | 新增: public object Data { get { return data; } set { data = value; OnPropertyChanged(); } } | |
| 15 | 新增: | |
| 16 | 新增: private ObservableCollection<string> TabbarData_; | |
| 17 | 新增: /// <summary> | |
| 18 | 新增: /// tabbar data | |
| 19 | 新增: /// </summary> | |
| 20 | 新增: public ObservableCollection<string> TabbarData { get { return TabbarData_; } set { TabbarData_ = value; OnPropertyChanged(); } } | |
| 21 | 新增: | |
| 22 | 新增: private int TabbarSelectedIndex_; | |
| 23 | 新增: /// <summary> | |
| 24 | 新增: /// tabbar selected item index | |
| 25 | 新增: /// </summary> | |
| 26 | 新增: public int TabbarSelectedIndex { get { return TabbarSelectedIndex_; } set { TabbarSelectedIndex_ = value; OnPropertyChanged(); } } | |
| 27 | 新增: | |
| 28 | 新增: private string version; | |
| 29 | 新增: /// <summary> | |
| 30 | 新增: /// 软件版本号 | |
| 31 | 新增: /// </summary> | |
| 32 | 新增: public string Version{ get { return version; } set { version = value; OnPropertyChanged(); } } | |
| 33 | 新增: | |
| 34 | 新增: } | |
| 35 | 新增:} | |
| @@ -7,12 +7,12 @@ using System.Windows; | ||
| 7 | 7 | // 有关程序集的一般信息由以下 |
| 8 | 8 | // 控制。更改这些特性值可修改 |
| 9 | 9 | // 与程序集关联的信息。 |
| 10 | 删除:[assembly: AssemblyTitle("Test")] | |
| 11 | 删除:[assembly: AssemblyDescription("")] | |
| 10 | 新增:[assembly: AssemblyTitle("Tai")] | |
| 11 | 新增:[assembly: AssemblyDescription("Tai")] | |
| 12 | 12 | [assembly: AssemblyConfiguration("")] |
| 13 | 删除:[assembly: AssemblyCompany("")] | |
| 14 | 删除:[assembly: AssemblyProduct("UI")] | |
| 15 | 删除:[assembly: AssemblyCopyright("Copyright © 2021")] | |
| 13 | 新增:[assembly: AssemblyCompany("nacat")] | |
| 14 | 新增:[assembly: AssemblyProduct("Tai")] | |
| 15 | 新增:[assembly: AssemblyCopyright("Copyright © 2021 https://github.com/noberumotto")] | |
| 16 | 16 | [assembly: AssemblyTrademark("")] |
| 17 | 17 | [assembly: AssemblyCulture("")] |
| 18 | 18 | |
二进制文件,不显示改动。
二进制文件,不显示改动。
二进制文件,不显示改动。
| @@ -0,0 +1,33 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Base"> | |
| 4 | 新增: <Style TargetType="{x:Type local:EmptyData}"> | |
| 5 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 6 | 新增: Value="true" /> | |
| 7 | 新增: <Setter Property="HorizontalAlignment" | |
| 8 | 新增: Value="Left" /> | |
| 9 | 新增: | |
| 10 | 新增: | |
| 11 | 新增: <Setter Property="Template"> | |
| 12 | 新增: <Setter.Value> | |
| 13 | 新增: <ControlTemplate TargetType="{x:Type local:EmptyData}"> | |
| 14 | 新增: <Border > | |
| 15 | 新增: | |
| 16 | 新增: <StackPanel> | |
| 17 | 新增: <Grid> | |
| 18 | 新增: <local:Icon IconType="Preview" FontSize="100" Foreground="Gray" RenderTransformOrigin=".5,.5" Opacity=".3"> | |
| 19 | 新增: <local:Icon.RenderTransform> | |
| 20 | 新增: <RotateTransform Angle="90" /> | |
| 21 | 新增: </local:Icon.RenderTransform> | |
| 22 | 新增: </local:Icon> | |
| 23 | 新增: </Grid> | |
| 24 | 新增: <TextBlock Text="暂时没有数据" HorizontalAlignment="Center" Foreground="Gray" Opacity=".3"/> | |
| 25 | 新增: </StackPanel> | |
| 26 | 新增: | |
| 27 | 新增: </Border> | |
| 28 | 新增: | |
| 29 | 新增: </ControlTemplate> | |
| 30 | 新增: </Setter.Value> | |
| 31 | 新增: </Setter> | |
| 32 | 新增: </Style> | |
| 33 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,32 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Base"> | |
| 4 | 新增: <Style TargetType="{x:Type local:Placeholder}"> | |
| 5 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 6 | 新增: Value="true" /> | |
| 7 | 新增: | |
| 8 | 新增: | |
| 9 | 新增: | |
| 10 | 新增: <Setter Property="Template"> | |
| 11 | 新增: <Setter.Value> | |
| 12 | 新增: <ControlTemplate TargetType="{x:Type local:Placeholder}"> | |
| 13 | 新增: <Border CornerRadius="{TemplateBinding CornerRadius}" Background="#e0e0e0" ClipToBounds="True"> | |
| 14 | 新增: <Border x:Name="Flash" Background="White" Width="10" Height="{TemplateBinding Height}" Opacity=".5" RenderTransformOrigin="0,0.5"> | |
| 15 | 新增: <Border.Effect> | |
| 16 | 新增: <BlurEffect Radius="30" ></BlurEffect> | |
| 17 | 新增: </Border.Effect> | |
| 18 | 新增: <Border.RenderTransform> | |
| 19 | 新增: <TransformGroup> | |
| 20 | 新增: <TranslateTransform X="-10" /> | |
| 21 | 新增: <RotateTransform Angle="15"/> | |
| 22 | 新增: </TransformGroup> | |
| 23 | 新增: </Border.RenderTransform> | |
| 24 | 新增: </Border> | |
| 25 | 新增: | |
| 26 | 新增: </Border> | |
| 27 | 新增: | |
| 28 | 新增: </ControlTemplate> | |
| 29 | 新增: </Setter.Value> | |
| 30 | 新增: </Setter> | |
| 31 | 新增: </Style> | |
| 32 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,92 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Button" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base" | |
| 5 | 新增: xmlns:sys="clr-namespace:System;assembly=mscorlib"> | |
| 6 | 新增: <Style TargetType="{x:Type local:Button}"> | |
| 7 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 8 | 新增: Value="true" /> | |
| 9 | 新增: <Setter Property="UseLayoutRounding" Value="True"/> | |
| 10 | 新增: | |
| 11 | 新增: <!--<Setter Property="MinWidth" Value="150"/>--> | |
| 12 | 新增: <Setter Property="Height" Value="35"/> | |
| 13 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 14 | 新增: <Setter Property="Template"> | |
| 15 | 新增: <Setter.Value> | |
| 16 | 新增: <ControlTemplate TargetType="{x:Type local:Button}"> | |
| 17 | 新增: <Border Background="{TemplateBinding Background}" x:Name="Border"> | |
| 18 | 新增: | |
| 19 | 新增: <Border BorderBrush="#f3f3f3" BorderThickness="1" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" x:Name="BoxBorder" CornerRadius="4" Background="White"> | |
| 20 | 新增: <Border.Effect> | |
| 21 | 新增: <DropShadowEffect BlurRadius="5" ShadowDepth="2" Direction="315" Color="Gray" Opacity=".1"/> | |
| 22 | 新增: </Border.Effect> | |
| 23 | 新增: <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> | |
| 24 | 新增: <Grid.ColumnDefinitions> | |
| 25 | 新增: <ColumnDefinition Width="auto"/> | |
| 26 | 新增: <ColumnDefinition Width="auto"/> | |
| 27 | 新增: </Grid.ColumnDefinitions> | |
| 28 | 新增: <base:Icon x:Name="Icon" Margin="0,0,5,0" IconType="{TemplateBinding Icon}" VerticalAlignment="Center" FontSize="12" > | |
| 29 | 新增: | |
| 30 | 新增: </base:Icon> | |
| 31 | 新增: <ContentPresenter | |
| 32 | 新增: Grid.Column="1" | |
| 33 | 新增: HorizontalAlignment="Center" | |
| 34 | 新增: VerticalAlignment="Center" | |
| 35 | 新增: RecognizesAccessKey="True"/> | |
| 36 | 新增: </Grid> | |
| 37 | 新增: | |
| 38 | 新增: </Border> | |
| 39 | 新增: | |
| 40 | 新增: <VisualStateManager.VisualStateGroups> | |
| 41 | 新增: <VisualStateGroup x:Name="CommonStates"> | |
| 42 | 新增: <VisualStateGroup.Transitions> | |
| 43 | 新增: <VisualTransition GeneratedDuration="0:0:0.18" /> | |
| 44 | 新增: <VisualTransition GeneratedDuration="0" | |
| 45 | 新增: To="Pressed" /> | |
| 46 | 新增: </VisualStateGroup.Transitions> | |
| 47 | 新增: <VisualState x:Name="Normal" /> | |
| 48 | 新增: <VisualState x:Name="MouseOver"> | |
| 49 | 新增: <Storyboard> | |
| 50 | 新增: <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Effect).(DropShadowEffect.Color)" | |
| 51 | 新增: Storyboard.TargetName="BoxBorder"> | |
| 52 | 新增: <EasingColorKeyFrame KeyTime="0" | |
| 53 | 新增: Value="#2b20d9" /> | |
| 54 | 新增: </ColorAnimationUsingKeyFrames> | |
| 55 | 新增: <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" | |
| 56 | 新增: Storyboard.TargetName="BoxBorder"> | |
| 57 | 新增: <EasingColorKeyFrame KeyTime="0" | |
| 58 | 新增: Value="#2b20d9" /> | |
| 59 | 新增: </ColorAnimationUsingKeyFrames> | |
| 60 | 新增: <!--<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" | |
| 61 | 新增: Storyboard.TargetName="BoxBorder"> | |
| 62 | 新增: <EasingColorKeyFrame KeyTime="0" | |
| 63 | 新增: Value="#2b20d9" /> | |
| 64 | 新增: </ColorAnimationUsingKeyFrames> | |
| 65 | 新增: <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)" | |
| 66 | 新增: > | |
| 67 | 新增: <EasingColorKeyFrame KeyTime="0" | |
| 68 | 新增: Value="White" /> | |
| 69 | 新增: </ColorAnimationUsingKeyFrames>--> | |
| 70 | 新增: </Storyboard> | |
| 71 | 新增: </VisualState> | |
| 72 | 新增: <VisualState x:Name="Pressed"> | |
| 73 | 新增: | |
| 74 | 新增: </VisualState> | |
| 75 | 新增: </VisualStateGroup> | |
| 76 | 新增: </VisualStateManager.VisualStateGroups> | |
| 77 | 新增: | |
| 78 | 新增: </Border> | |
| 79 | 新增: <ControlTemplate.Triggers> | |
| 80 | 新增: <Trigger Property="Icon" Value="None"> | |
| 81 | 新增: <Setter TargetName="Icon" Property="Visibility" Value="Collapsed"/> | |
| 82 | 新增: </Trigger> | |
| 83 | 新增: <Trigger Property="IsMouseOver" Value="True"> | |
| 84 | 新增: <Setter TargetName="BoxBorder" Property="BorderThickness" Value="0"/> | |
| 85 | 新增: <Setter Property="Foreground" Value="White"/> | |
| 86 | 新增: </Trigger> | |
| 87 | 新增: </ControlTemplate.Triggers> | |
| 88 | 新增: </ControlTemplate> | |
| 89 | 新增: </Setter.Value> | |
| 90 | 新增: </Setter> | |
| 91 | 新增: </Style> | |
| 92 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,54 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Button" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base" | |
| 5 | 新增: xmlns:sys="clr-namespace:System;assembly=mscorlib"> | |
| 6 | 新增: <Style TargetType="{x:Type local:IconButton}"> | |
| 7 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 8 | 新增: Value="true" /> | |
| 9 | 新增: <Setter Property="Width" Value="35"/> | |
| 10 | 新增: <Setter Property="Height" Value="35"/> | |
| 11 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 12 | 新增: <Setter Property="Template"> | |
| 13 | 新增: <Setter.Value> | |
| 14 | 新增: <ControlTemplate TargetType="{x:Type local:IconButton}"> | |
| 15 | 新增: <Border Background="{TemplateBinding Background}" x:Name="Border"> | |
| 16 | 新增: | |
| 17 | 新增: <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" x:Name="BoxBorder" CornerRadius="4" Padding="5" Background="Transparent"> | |
| 18 | 新增: <base:Icon x:Name="Icon" IconType="{TemplateBinding Icon}" Foreground="#5c5c5c" VerticalAlignment="Center" FontSize="16" > | |
| 19 | 新增: | |
| 20 | 新增: </base:Icon> | |
| 21 | 新增: </Border> | |
| 22 | 新增: | |
| 23 | 新增: <VisualStateManager.VisualStateGroups> | |
| 24 | 新增: <VisualStateGroup x:Name="CommonStates"> | |
| 25 | 新增: <VisualStateGroup.Transitions> | |
| 26 | 新增: <VisualTransition GeneratedDuration="0:0:0.15" /> | |
| 27 | 新增: <VisualTransition GeneratedDuration="0" | |
| 28 | 新增: To="Pressed" /> | |
| 29 | 新增: </VisualStateGroup.Transitions> | |
| 30 | 新增: <VisualState x:Name="Normal" /> | |
| 31 | 新增: <VisualState x:Name="MouseOver"> | |
| 32 | 新增: <Storyboard> | |
| 33 | 新增: <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" | |
| 34 | 新增: Storyboard.TargetName="BoxBorder"> | |
| 35 | 新增: <EasingColorKeyFrame KeyTime="0" | |
| 36 | 新增: Value="#eaeaea" /> | |
| 37 | 新增: </ColorAnimationUsingKeyFrames> | |
| 38 | 新增: </Storyboard> | |
| 39 | 新增: </VisualState> | |
| 40 | 新增: <VisualState x:Name="Pressed"> | |
| 41 | 新增: | |
| 42 | 新增: </VisualState> | |
| 43 | 新增: </VisualStateGroup> | |
| 44 | 新增: </VisualStateManager.VisualStateGroups> | |
| 45 | 新增: | |
| 46 | 新增: </Border> | |
| 47 | 新增: <ControlTemplate.Triggers> | |
| 48 | 新增: | |
| 49 | 新增: </ControlTemplate.Triggers> | |
| 50 | 新增: </ControlTemplate> | |
| 51 | 新增: </Setter.Value> | |
| 52 | 新增: </Setter> | |
| 53 | 新增: </Style> | |
| 54 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,50 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Charts"> | |
| 4 | 新增: <Style TargetType="{x:Type local:Charts}"> | |
| 5 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 6 | 新增: Value="true" /> | |
| 7 | 新增: | |
| 8 | 新增: | |
| 9 | 新增: <Setter Property="FontSize" Value="14"/> | |
| 10 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 11 | 新增: | |
| 12 | 新增: <Setter Property="Template"> | |
| 13 | 新增: <Setter.Value> | |
| 14 | 新增: <ControlTemplate TargetType="{x:Type local:Charts}"> | |
| 15 | 新增: <Border Background="{TemplateBinding Background}"> | |
| 16 | 新增: <Grid> | |
| 17 | 新增: <Grid x:Name="HorizontalA" Visibility="Collapsed"> | |
| 18 | 新增: <StackPanel x:Name="Container"> | |
| 19 | 新增: </StackPanel> | |
| 20 | 新增: </Grid> | |
| 21 | 新增: <Grid x:Name="Card" Visibility="Collapsed"> | |
| 22 | 新增: <WrapPanel x:Name="CardContainer"> | |
| 23 | 新增: </WrapPanel> | |
| 24 | 新增: </Grid> | |
| 25 | 新增: <Grid x:Name="Month" Visibility="Collapsed"> | |
| 26 | 新增: <Grid x:Name="MonthContainer"> | |
| 27 | 新增: </Grid> | |
| 28 | 新增: </Grid> | |
| 29 | 新增: </Grid> | |
| 30 | 新增: </Border> | |
| 31 | 新增: | |
| 32 | 新增: <ControlTemplate.Triggers> | |
| 33 | 新增: <Trigger Property="ChartsType" | |
| 34 | 新增: Value="HorizontalA"> | |
| 35 | 新增: <Setter TargetName="HorizontalA" Property="Visibility" Value="Visible"/> | |
| 36 | 新增: </Trigger> | |
| 37 | 新增: <Trigger Property="ChartsType" | |
| 38 | 新增: Value="Card"> | |
| 39 | 新增: <Setter TargetName="Card" Property="Visibility" Value="Visible"/> | |
| 40 | 新增: </Trigger> | |
| 41 | 新增: <Trigger Property="ChartsType" | |
| 42 | 新增: Value="Month"> | |
| 43 | 新增: <Setter TargetName="Month" Property="Visibility" Value="Visible"/> | |
| 44 | 新增: </Trigger> | |
| 45 | 新增: </ControlTemplate.Triggers> | |
| 46 | 新增: </ControlTemplate> | |
| 47 | 新增: </Setter.Value> | |
| 48 | 新增: </Setter> | |
| 49 | 新增: </Style> | |
| 50 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,87 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Charts" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base"> | |
| 5 | 新增: <Style TargetType="{x:Type local:ChartsItemTypeA}"> | |
| 6 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 7 | 新增: Value="true" /> | |
| 8 | 新增: | |
| 9 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 10 | 新增: <Setter Property="Margin" Value="0,5"/> | |
| 11 | 新增: | |
| 12 | 新增: <Setter Property="Template"> | |
| 13 | 新增: <Setter.Value> | |
| 14 | 新增: <ControlTemplate TargetType="{x:Type local:ChartsItemTypeA}"> | |
| 15 | 新增: <Border Background="{TemplateBinding Background}"> | |
| 16 | 新增: <Grid> | |
| 17 | 新增: <Grid x:Name="Normal"> | |
| 18 | 新增: <Grid.ColumnDefinitions> | |
| 19 | 新增: <ColumnDefinition Width="auto"/> | |
| 20 | 新增: <ColumnDefinition Width="*"/> | |
| 21 | 新增: </Grid.ColumnDefinitions> | |
| 22 | 新增: <Grid Margin="0,0,10,0"> | |
| 23 | 新增: <Border Background="#f3f3f3" CornerRadius="6" Width="50" Height="50" HorizontalAlignment="Left"> | |
| 24 | 新增: <Image x:Name="IconObj" Width="25" HorizontalAlignment="Center" VerticalAlignment="Center"/> | |
| 25 | 新增: </Border> | |
| 26 | 新增: </Grid> | |
| 27 | 新增: <StackPanel Grid.Column="1" x:Name="ValueContainer" VerticalAlignment="Center" > | |
| 28 | 新增: <TextBlock x:Name="NameTextObj" Foreground="#5c5c5c" HorizontalAlignment="Left"/> | |
| 29 | 新增: <StackPanel Orientation="Horizontal" > | |
| 30 | 新增: <Rectangle | |
| 31 | 新增: x:Name="ValueBlockObj" | |
| 32 | 新增: RadiusX="4" | |
| 33 | 新增: RadiusY="4" | |
| 34 | 新增: Fill="#cccccc" | |
| 35 | 新增: Height="8" | |
| 36 | 新增: VerticalAlignment="Center" | |
| 37 | 新增: HorizontalAlignment="Left" | |
| 38 | 新增: /> | |
| 39 | 新增: | |
| 40 | 新增: <TextBlock x:Name="ValueTextObj" VerticalAlignment="Center" Foreground="#5c5c5c" FontSize="12" Margin="5,0,0,0"/> | |
| 41 | 新增: </StackPanel> | |
| 42 | 新增: </StackPanel> | |
| 43 | 新增: | |
| 44 | 新增: </Grid> | |
| 45 | 新增: | |
| 46 | 新增: <Grid x:Name="Loading" Visibility="Collapsed"> | |
| 47 | 新增: <Grid.ColumnDefinitions> | |
| 48 | 新增: <ColumnDefinition Width="auto"/> | |
| 49 | 新增: <ColumnDefinition Width="*"/> | |
| 50 | 新增: </Grid.ColumnDefinitions> | |
| 51 | 新增: <Grid Margin="0,0,10,0"> | |
| 52 | 新增: | |
| 53 | 新增: <base:Placeholder CornerRadius="6" Width="50" Height="50" HorizontalAlignment="Left"> | |
| 54 | 新增: <!--<Rectangle Height="25" Fill="" Width="25" HorizontalAlignment="Center" VerticalAlignment="Center"/>--> | |
| 55 | 新增: </base:Placeholder> | |
| 56 | 新增: </Grid> | |
| 57 | 新增: <StackPanel Grid.Column="1" VerticalAlignment="Center" > | |
| 58 | 新增: <base:Placeholder Width="100" Height="12" HorizontalAlignment="Left" Margin="0,0,0,6"/> | |
| 59 | 新增: <StackPanel Orientation="Horizontal" > | |
| 60 | 新增: <Rectangle | |
| 61 | 新增: RadiusX="0" | |
| 62 | 新增: RadiusY="0" | |
| 63 | 新增: Fill="#e0e0e0" | |
| 64 | 新增: Height="8" | |
| 65 | 新增: Width="256" | |
| 66 | 新增: VerticalAlignment="Center" | |
| 67 | 新增: HorizontalAlignment="Left" | |
| 68 | 新增: /> | |
| 69 | 新增: | |
| 70 | 新增: <!--<TextBlock VerticalAlignment="Center" Foreground="#5c5c5c" FontSize="12" Margin="5,0,0,0"/>--> | |
| 71 | 新增: </StackPanel> | |
| 72 | 新增: </StackPanel> | |
| 73 | 新增: </Grid> | |
| 74 | 新增: </Grid> | |
| 75 | 新增: </Border> | |
| 76 | 新增: | |
| 77 | 新增: <ControlTemplate.Triggers> | |
| 78 | 新增: <Trigger Property="IsLoading" Value="True"> | |
| 79 | 新增: <Setter TargetName="Loading" Property="Visibility" Value="Visible"/> | |
| 80 | 新增: <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/> | |
| 81 | 新增: </Trigger> | |
| 82 | 新增: </ControlTemplate.Triggers> | |
| 83 | 新增: </ControlTemplate> | |
| 84 | 新增: </Setter.Value> | |
| 85 | 新增: </Setter> | |
| 86 | 新增: </Style> | |
| 87 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,80 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Charts" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base"> | |
| 5 | 新增: <Style TargetType="{x:Type local:ChartsItemTypeCard}"> | |
| 6 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 7 | 新增: Value="true" /> | |
| 8 | 新增: | |
| 9 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 10 | 新增: <Setter Property="Margin" Value="5"/> | |
| 11 | 新增: | |
| 12 | 新增: <Setter Property="Template"> | |
| 13 | 新增: <Setter.Value> | |
| 14 | 新增: <ControlTemplate TargetType="{x:Type local:ChartsItemTypeCard}"> | |
| 15 | 新增: <Grid > | |
| 16 | 新增: <Grid x:Name="Normal"> | |
| 17 | 新增: <Border CornerRadius="12"> | |
| 18 | 新增: <!--<Border.Effect> | |
| 19 | 新增: <DropShadowEffect BlurRadius="14" ShadowDepth="0" Direction="0" Opacity="0.05"/> | |
| 20 | 新增: </Border.Effect>--> | |
| 21 | 新增: <Border Margin="0" Background="White" CornerRadius="12" Width="150" Height="150" > | |
| 22 | 新增: | |
| 23 | 新增: <Border.Clip> | |
| 24 | 新增: <RectangleGeometry RadiusX="12" RadiusY="12" Rect="0,0,150,150"/> | |
| 25 | 新增: </Border.Clip> | |
| 26 | 新增: | |
| 27 | 新增: <Grid> | |
| 28 | 新增: <Rectangle | |
| 29 | 新增: x:Name="ValueBlockObj" | |
| 30 | 新增: | |
| 31 | 新增: | |
| 32 | 新增: HorizontalAlignment="Stretch" | |
| 33 | 新增: VerticalAlignment="Center" | |
| 34 | 新增: > | |
| 35 | 新增: <Rectangle.Effect> | |
| 36 | 新增: <BlurEffect KernelType="Gaussian" Radius="100"/> | |
| 37 | 新增: </Rectangle.Effect> | |
| 38 | 新增: <Rectangle.Fill> | |
| 39 | 新增: <LinearGradientBrush EndPoint="2,1" StartPoint="-2,0"> | |
| 40 | 新增: <GradientStop Color="White"/> | |
| 41 | 新增: <GradientStop Color="#ff305b" Offset="1"/> | |
| 42 | 新增: </LinearGradientBrush> | |
| 43 | 新增: </Rectangle.Fill> | |
| 44 | 新增: </Rectangle> | |
| 45 | 新增: <Border VerticalAlignment="Center" HorizontalAlignment="Center"> | |
| 46 | 新增: <Image x:Name="IconObj" Width="25" HorizontalAlignment="Center" VerticalAlignment="Center"/> | |
| 47 | 新增: </Border> | |
| 48 | 新增: | |
| 49 | 新增: <TextBlock x:Name="NameTextObj" Foreground="#5c5c5c" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="10"/> | |
| 50 | 新增: | |
| 51 | 新增: <Border VerticalAlignment="Top" CornerRadius="5" Padding="5" HorizontalAlignment="Left" Margin="10" > | |
| 52 | 新增: <Border.Background> | |
| 53 | 新增: <SolidColorBrush Color="#ff305b" Opacity="0.7"/> | |
| 54 | 新增: </Border.Background> | |
| 55 | 新增: <TextBlock x:Name="ValueTextObj" Foreground="White" FontSize="12" /> | |
| 56 | 新增: | |
| 57 | 新增: </Border> | |
| 58 | 新增: | |
| 59 | 新增: </Grid> | |
| 60 | 新增: | |
| 61 | 新增: </Border> | |
| 62 | 新增: </Border> | |
| 63 | 新增: | |
| 64 | 新增: </Grid> | |
| 65 | 新增: | |
| 66 | 新增: <Grid x:Name="Loading" Visibility="Collapsed"> | |
| 67 | 新增: <base:Placeholder CornerRadius="12" Width="150" Height="150"/> | |
| 68 | 新增: </Grid> | |
| 69 | 新增: </Grid> | |
| 70 | 新增: <ControlTemplate.Triggers> | |
| 71 | 新增: <Trigger Property="IsLoading" Value="True"> | |
| 72 | 新增: <Setter TargetName="Loading" Property="Visibility" Value="Visible"/> | |
| 73 | 新增: <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/> | |
| 74 | 新增: </Trigger> | |
| 75 | 新增: </ControlTemplate.Triggers> | |
| 76 | 新增: </ControlTemplate> | |
| 77 | 新增: </Setter.Value> | |
| 78 | 新增: </Setter> | |
| 79 | 新增: </Style> | |
| 80 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,74 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Charts" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base"> | |
| 5 | 新增: <Style TargetType="{x:Type local:ChartsItemTypeMonth}"> | |
| 6 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 7 | 新增: Value="true" /> | |
| 8 | 新增: | |
| 9 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 10 | 新增: <Setter Property="Margin" Value="5"/> | |
| 11 | 新增: <Setter Property="HorizontalAlignment" Value="Center"/> | |
| 12 | 新增: <Setter Property="VerticalAlignment" Value="Center"/> | |
| 13 | 新增: | |
| 14 | 新增: <Setter Property="Template"> | |
| 15 | 新增: <Setter.Value> | |
| 16 | 新增: <ControlTemplate TargetType="{x:Type local:ChartsItemTypeMonth}"> | |
| 17 | 新增: <Grid > | |
| 18 | 新增: <Grid x:Name="Normal"> | |
| 19 | 新增: <Border> | |
| 20 | 新增: <!--<Border.Effect> | |
| 21 | 新增: <DropShadowEffect BlurRadius="14" ShadowDepth="0" Direction="0" Opacity="0.05"/> | |
| 22 | 新增: </Border.Effect>--> | |
| 23 | 新增: <Border x:Name="Border" Margin="0" Background="#f3f3f3" CornerRadius="4" Width="20" Height="20" BorderThickness="0" BorderBrush="#2b20d9"> | |
| 24 | 新增: | |
| 25 | 新增: <Border.Clip> | |
| 26 | 新增: <RectangleGeometry RadiusX="4" RadiusY="4" Rect="0,0,20,20"/> | |
| 27 | 新增: </Border.Clip> | |
| 28 | 新增: | |
| 29 | 新增: <Grid> | |
| 30 | 新增: <!--<TextBlock x:Name="ValueTextObj"/>--> | |
| 31 | 新增: <Rectangle | |
| 32 | 新增: x:Name="ValueBlockObj" | |
| 33 | 新增: | |
| 34 | 新增: | |
| 35 | 新增: HorizontalAlignment="Stretch" | |
| 36 | 新增: VerticalAlignment="Center" | |
| 37 | 新增: > | |
| 38 | 新增: <Rectangle.Effect> | |
| 39 | 新增: <BlurEffect KernelType="Gaussian" Radius="20"/> | |
| 40 | 新增: </Rectangle.Effect> | |
| 41 | 新增: <Rectangle.Fill> | |
| 42 | 新增: <LinearGradientBrush EndPoint="2,1" StartPoint="-2,0"> | |
| 43 | 新增: <GradientStop Color="White"/> | |
| 44 | 新增: <GradientStop Color="#ff305b" Offset="1"/> | |
| 45 | 新增: </LinearGradientBrush> | |
| 46 | 新增: </Rectangle.Fill> | |
| 47 | 新增: </Rectangle> | |
| 48 | 新增: </Grid> | |
| 49 | 新增: | |
| 50 | 新增: </Border> | |
| 51 | 新增: </Border> | |
| 52 | 新增: | |
| 53 | 新增: </Grid> | |
| 54 | 新增: | |
| 55 | 新增: <Grid x:Name="Loading" Visibility="Collapsed"> | |
| 56 | 新增: <base:Placeholder CornerRadius="12" Width="150" Height="150"/> | |
| 57 | 新增: </Grid> | |
| 58 | 新增: </Grid> | |
| 59 | 新增: <ControlTemplate.Triggers> | |
| 60 | 新增: <Trigger Property="IsLoading" Value="True"> | |
| 61 | 新增: <Setter TargetName="Loading" Property="Visibility" Value="Visible"/> | |
| 62 | 新增: <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/> | |
| 63 | 新增: </Trigger> | |
| 64 | 新增: <Trigger Property="IsSelected" Value="True"> | |
| 65 | 新增: <Setter TargetName="Border" Property="BorderThickness" Value="1"/> | |
| 66 | 新增: <Setter TargetName="Border" Property="Background" Value="White"/> | |
| 67 | 新增: | |
| 68 | 新增: </Trigger> | |
| 69 | 新增: </ControlTemplate.Triggers> | |
| 70 | 新增: </ControlTemplate> | |
| 71 | 新增: </Setter.Value> | |
| 72 | 新增: </Setter> | |
| 73 | 新增: </Style> | |
| 74 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,36 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.DatePickerBar" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base"> | |
| 5 | 新增: <Style TargetType="{x:Type local:DatePickerBar}"> | |
| 6 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 7 | 新增: Value="true" /> | |
| 8 | 新增: | |
| 9 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 10 | 新增: <Setter Property="Template"> | |
| 11 | 新增: <Setter.Value> | |
| 12 | 新增: <ControlTemplate TargetType="{x:Type local:DatePickerBar}"> | |
| 13 | 新增: <Border> | |
| 14 | 新增: <StackPanel> | |
| 15 | 新增: <TextBlock Foreground="#5c5c5c" FontSize="15" Text="{TemplateBinding SelectedDateString}" HorizontalAlignment="Center" Margin="0,10"/> | |
| 16 | 新增: <Grid> | |
| 17 | 新增: <Border Background="White" Padding="10" CornerRadius="10"> | |
| 18 | 新增: <ScrollViewer x:Name="ScrollViewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Hidden"> | |
| 19 | 新增: <StackPanel | |
| 20 | 新增: Orientation="Horizontal" | |
| 21 | 新增: x:Name="Container"> | |
| 22 | 新增: | |
| 23 | 新增: </StackPanel> | |
| 24 | 新增: </ScrollViewer> | |
| 25 | 新增: </Border> | |
| 26 | 新增: </Grid> | |
| 27 | 新增: </StackPanel> | |
| 28 | 新增: </Border> | |
| 29 | 新增: <ControlTemplate.Triggers> | |
| 30 | 新增: | |
| 31 | 新增: </ControlTemplate.Triggers> | |
| 32 | 新增: </ControlTemplate> | |
| 33 | 新增: </Setter.Value> | |
| 34 | 新增: </Setter> | |
| 35 | 新增: </Style> | |
| 36 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,42 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.DatePickerBar" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base"> | |
| 5 | 新增: <Style TargetType="{x:Type local:DatePickerBarItem}"> | |
| 6 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 7 | 新增: Value="true" /> | |
| 8 | 新增: | |
| 9 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 10 | 新增: <Setter Property="Template"> | |
| 11 | 新增: <Setter.Value> | |
| 12 | 新增: <ControlTemplate TargetType="{x:Type local:DatePickerBarItem}"> | |
| 13 | 新增: <Border> | |
| 14 | 新增: | |
| 15 | 新增: | |
| 16 | 新增: <Grid Margin="2"> | |
| 17 | 新增: | |
| 18 | 新增: <Border x:Name="Bg" Background="#f9f9f9" Width="45" Height="45" CornerRadius="25"> | |
| 19 | 新增: <TextBlock x:Name="Text" Foreground="#5c5c5c" Text="{TemplateBinding Title}" HorizontalAlignment="Center" VerticalAlignment="Center"/> | |
| 20 | 新增: </Border> | |
| 21 | 新增: </Grid> | |
| 22 | 新增: | |
| 23 | 新增: </Border> | |
| 24 | 新增: <ControlTemplate.Triggers> | |
| 25 | 新增: <Trigger Property="IsSelected" | |
| 26 | 新增: Value="True"> | |
| 27 | 新增: <Setter TargetName="Bg" Property="Background" Value="#2b20d9"/> | |
| 28 | 新增: <Setter TargetName="Text" Property="Foreground" Value="white"/> | |
| 29 | 新增: | |
| 30 | 新增: </Trigger> | |
| 31 | 新增: <Trigger Property="IsDisabled" | |
| 32 | 新增: Value="True"> | |
| 33 | 新增: <!--<Setter TargetName="Bg" Property="Background" Value="#2b20d9"/>--> | |
| 34 | 新增: <Setter TargetName="Text" Property="Foreground" Value="#ccc"/> | |
| 35 | 新增: | |
| 36 | 新增: </Trigger> | |
| 37 | 新增: </ControlTemplate.Triggers> | |
| 38 | 新增: </ControlTemplate> | |
| 39 | 新增: </Setter.Value> | |
| 40 | 新增: </Setter> | |
| 41 | 新增: </Style> | |
| 42 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -1,4 +1,4 @@ | ||
| 1 | 删除:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 2 | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> |
| 3 | 3 | <ResourceDictionary.MergedDictionaries> |
| 4 | 4 | <ResourceDictionary Source="/Tai;component/Themes/Window/HideWindow.xaml" /> |
| @@ -6,7 +6,28 @@ | ||
| 6 | 6 | <ResourceDictionary Source="/Tai;component/Themes/Navigation/NavigationItem.xaml"/> |
| 7 | 7 | <ResourceDictionary Source="/Tai;component/Themes/Navigation/Navigation.xaml"/> |
| 8 | 8 | <ResourceDictionary Source="/Tai;component/Themes/Base/Icon.xaml"/> |
| 9 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Base/Placeholder.xaml"/> | |
| 10 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Base/EmptyData.xaml"/> | |
| 11 | 新增: | |
| 9 | 12 | <ResourceDictionary Source="/Tai;component/Themes/PageContainer.xaml"/> |
| 13 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Charts/Charts.xaml"/> | |
| 14 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Charts/ChartsItemTypeA.xaml"/> | |
| 15 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Charts/ChartsItemTypeCard.xaml"/> | |
| 16 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Charts/ChartsItemTypeMonth.xaml"/> | |
| 17 | 新增: | |
| 18 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Tabbar/Tabbar.xaml"/> | |
| 19 | 新增: <ResourceDictionary Source="/Tai;component/Themes/DatePickerBar/DatePickerBar.xaml"/> | |
| 20 | 新增: <ResourceDictionary Source="/Tai;component/Themes/DatePickerBar/DatePickerBarItem.xaml"/> | |
| 21 | 新增: <ResourceDictionary Source="/Tai;component/Themes/SettingPanel/SettingPanel.xaml"/> | |
| 22 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Toggle/Toggle.xaml"/> | |
| 23 | 新增: <ResourceDictionary Source="/Tai;component/Themes/SettingPanel/SettingPanelItem.xaml"/> | |
| 24 | 新增: <ResourceDictionary Source="/Tai;component/Themes/SettingPanel/SettingPanelMultiItem.xaml"/> | |
| 25 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Input/InputBox.xaml"/> | |
| 26 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Button/IconButton.xaml"/> | |
| 27 | 新增: <ResourceDictionary Source="/Tai;component/Themes/Button/Button.xaml"/> | |
| 28 | 新增: <ResourceDictionary Source="/Tai;component/Themes/List/BaseList.xaml"/> | |
| 29 | 新增: <ResourceDictionary Source="/Tai;component/Themes/List/BaseListItem.xaml"/> | |
| 10 | 30 | |
| 11 | 31 | </ResourceDictionary.MergedDictionaries> |
| 12 | 删除:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| 32 | 新增: | |
| 33 | 新增:</ResourceDictionary> | |
| @@ -0,0 +1,59 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Input" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base" | |
| 5 | 新增: xmlns:sys="clr-namespace:System;assembly=mscorlib"> | |
| 6 | 新增: <Style TargetType="{x:Type local:InputBox}"> | |
| 7 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 8 | 新增: Value="true" /> | |
| 9 | 新增: <Setter Property="Width" Value="auto"/> | |
| 10 | 新增: | |
| 11 | 新增: <Setter Property="Height" Value="35"/> | |
| 12 | 新增: <Setter Property="Cursor" Value="IBeam"/> | |
| 13 | 新增: | |
| 14 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 15 | 新增: <Setter Property="Template"> | |
| 16 | 新增: <Setter.Value> | |
| 17 | 新增: <ControlTemplate TargetType="{x:Type local:InputBox}"> | |
| 18 | 新增: <Border Background="{TemplateBinding Background}" x:Name="Border"> | |
| 19 | 新增: | |
| 20 | 新增: <Grid> | |
| 21 | 新增: <Border x:Name="BoxBorder" BorderBrush="#a3a3a3" BorderThickness="2" CornerRadius="4"> | |
| 22 | 新增: <Grid> | |
| 23 | 新增: <TextBlock Margin="5,0" x:Name="Placeholder" Text="{TemplateBinding Placeholder}" Foreground="#a3a3a3" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="Center" Visibility="Collapsed"/> | |
| 24 | 新增: <ScrollViewer Margin="5,0" | |
| 25 | 新增: x:Name="PART_ContentHost" VerticalAlignment="Center"/> | |
| 26 | 新增: </Grid> | |
| 27 | 新增: | |
| 28 | 新增: </Border> | |
| 29 | 新增: | |
| 30 | 新增: | |
| 31 | 新增: </Grid> | |
| 32 | 新增: <VisualStateManager.VisualStateGroups> | |
| 33 | 新增: <VisualStateGroup Name="FocusStates"> | |
| 34 | 新增: <VisualState Name="Unfocused"/> | |
| 35 | 新增: <!--Right here--> | |
| 36 | 新增: <VisualState Name="Focused"> | |
| 37 | 新增: <Storyboard> | |
| 38 | 新增: <ColorAnimation Storyboard.TargetName="BoxBorder" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" | |
| 39 | 新增: To="#2b20d9" | |
| 40 | 新增: Duration="0:0:.4"> | |
| 41 | 新增: <ColorAnimation.EasingFunction> | |
| 42 | 新增: <QuadraticEase/> | |
| 43 | 新增: </ColorAnimation.EasingFunction> | |
| 44 | 新增: </ColorAnimation> | |
| 45 | 新增: </Storyboard> | |
| 46 | 新增: </VisualState> | |
| 47 | 新增: </VisualStateGroup> | |
| 48 | 新增: </VisualStateManager.VisualStateGroups> | |
| 49 | 新增: </Border> | |
| 50 | 新增: <ControlTemplate.Triggers> | |
| 51 | 新增: <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="{x:Static sys:String.Empty}"> | |
| 52 | 新增: <Setter TargetName="Placeholder" Property="Visibility" Value="Visible" /> | |
| 53 | 新增: </DataTrigger> | |
| 54 | 新增: </ControlTemplate.Triggers> | |
| 55 | 新增: </ControlTemplate> | |
| 56 | 新增: </Setter.Value> | |
| 57 | 新增: </Setter> | |
| 58 | 新增: </Style> | |
| 59 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,38 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.List" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base" | |
| 5 | 新增: xmlns:sys="clr-namespace:System;assembly=mscorlib"> | |
| 6 | 新增: <Style TargetType="{x:Type local:BaseList}"> | |
| 7 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 8 | 新增: Value="true" /> | |
| 9 | 新增: <Setter Property="UseLayoutRounding" Value="True"/> | |
| 10 | 新增: | |
| 11 | 新增: <!--<Setter Property="MinWidth" Value="150"/>--> | |
| 12 | 新增: <Setter Property="Height" Value="auto"/> | |
| 13 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 14 | 新增: <Setter Property="Template"> | |
| 15 | 新增: <Setter.Value> | |
| 16 | 新增: <ControlTemplate TargetType="{x:Type local:BaseList}"> | |
| 17 | 新增: <Border Background="{TemplateBinding Background}" x:Name="Border"> | |
| 18 | 新增: | |
| 19 | 新增: <Grid> | |
| 20 | 新增: <StackPanel x:Name="Container"> | |
| 21 | 新增: | |
| 22 | 新增: </StackPanel> | |
| 23 | 新增: </Grid> | |
| 24 | 新增: | |
| 25 | 新增: </Border> | |
| 26 | 新增: <ControlTemplate.Triggers> | |
| 27 | 新增: <!--<Trigger Property="Icon" Value="None"> | |
| 28 | 新增: <Setter TargetName="Icon" Property="Visibility" Value="Collapsed"/> | |
| 29 | 新增: </Trigger> | |
| 30 | 新增: <Trigger Property="IsMouseOver" Value="True"> | |
| 31 | 新增: <Setter TargetName="BoxBorder" Property="BorderThickness" Value="0"/> | |
| 32 | 新增: </Trigger>--> | |
| 33 | 新增: </ControlTemplate.Triggers> | |
| 34 | 新增: </ControlTemplate> | |
| 35 | 新增: </Setter.Value> | |
| 36 | 新增: </Setter> | |
| 37 | 新增: </Style> | |
| 38 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,83 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.List" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base" | |
| 5 | 新增: xmlns:sys="clr-namespace:System;assembly=mscorlib"> | |
| 6 | 新增: <Style TargetType="{x:Type local:BaseListItem}"> | |
| 7 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 8 | 新增: Value="true" /> | |
| 9 | 新增: <Setter Property="UseLayoutRounding" Value="True"/> | |
| 10 | 新增: | |
| 11 | 新增: <!--<Setter Property="MinWidth" Value="150"/>--> | |
| 12 | 新增: <Setter Property="Height" Value="35"/> | |
| 13 | 新增: <Setter Property="Margin" Value="0,10,0,0"/> | |
| 14 | 新增: | |
| 15 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 16 | 新增: <Setter Property="Template"> | |
| 17 | 新增: <Setter.Value> | |
| 18 | 新增: <ControlTemplate TargetType="{x:Type local:BaseListItem}"> | |
| 19 | 新增: <Border Background="{TemplateBinding Background}" x:Name="Border"> | |
| 20 | 新增: | |
| 21 | 新增: <Border BorderBrush="#f3f3f3" BorderThickness="1" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" x:Name="BoxBorder" CornerRadius="4" Background="White" > | |
| 22 | 新增: <Border.Effect> | |
| 23 | 新增: <DropShadowEffect BlurRadius="5" ShadowDepth="2" Direction="315" Color="#ccc" Opacity=".05"/> | |
| 24 | 新增: </Border.Effect> | |
| 25 | 新增: <Grid VerticalAlignment="Center" Margin="10,0"> | |
| 26 | 新增: <Grid.ColumnDefinitions> | |
| 27 | 新增: <ColumnDefinition Width="9*"/> | |
| 28 | 新增: <ColumnDefinition Width="1*"/> | |
| 29 | 新增: </Grid.ColumnDefinitions> | |
| 30 | 新增: <TextBlock Text="{TemplateBinding Text}"/> | |
| 31 | 新增: </Grid> | |
| 32 | 新增: | |
| 33 | 新增: </Border> | |
| 34 | 新增: | |
| 35 | 新增: <VisualStateManager.VisualStateGroups> | |
| 36 | 新增: <VisualStateGroup x:Name="CommonStates"> | |
| 37 | 新增: <VisualStateGroup.Transitions> | |
| 38 | 新增: <VisualTransition GeneratedDuration="0:0:0.18" /> | |
| 39 | 新增: <VisualTransition GeneratedDuration="0" | |
| 40 | 新增: To="Pressed" /> | |
| 41 | 新增: </VisualStateGroup.Transitions> | |
| 42 | 新增: <VisualState x:Name="Normal" /> | |
| 43 | 新增: <VisualState x:Name="MouseOver"> | |
| 44 | 新增: <Storyboard> | |
| 45 | 新增: <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Effect).(DropShadowEffect.Color)" | |
| 46 | 新增: Storyboard.TargetName="BoxBorder"> | |
| 47 | 新增: <EasingColorKeyFrame KeyTime="0" | |
| 48 | 新增: Value="#2b20d9"/> | |
| 49 | 新增: </ColorAnimationUsingKeyFrames> | |
| 50 | 新增: <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" | |
| 51 | 新增: Storyboard.TargetName="BoxBorder"> | |
| 52 | 新增: <EasingColorKeyFrame KeyTime="0" | |
| 53 | 新增: Value="#192B20D9" /> | |
| 54 | 新增: </ColorAnimationUsingKeyFrames> | |
| 55 | 新增: <!--<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)" | |
| 56 | 新增: > | |
| 57 | 新增: <EasingColorKeyFrame KeyTime="0" | |
| 58 | 新增: Value="White" /> | |
| 59 | 新增: </ColorAnimationUsingKeyFrames>--> | |
| 60 | 新增: </Storyboard> | |
| 61 | 新增: </VisualState> | |
| 62 | 新增: <VisualState x:Name="Pressed"> | |
| 63 | 新增: | |
| 64 | 新增: </VisualState> | |
| 65 | 新增: </VisualStateGroup> | |
| 66 | 新增: </VisualStateManager.VisualStateGroups> | |
| 67 | 新增: | |
| 68 | 新增: </Border> | |
| 69 | 新增: <ControlTemplate.Triggers> | |
| 70 | 新增: <Trigger Property="IsSelected" Value="True"> | |
| 71 | 新增: <Setter TargetName="BoxBorder" Property="Background" Value="#2b20d9"/> | |
| 72 | 新增: <Setter Property="Foreground" Value="White"/> | |
| 73 | 新增: | |
| 74 | 新增: </Trigger> | |
| 75 | 新增: <!--<Trigger Property="IsMouseOver" Value="True"> | |
| 76 | 新增: <Setter TargetName="BoxBorder" Property="BorderThickness" Value="0"/> | |
| 77 | 新增: </Trigger>--> | |
| 78 | 新增: </ControlTemplate.Triggers> | |
| 79 | 新增: </ControlTemplate> | |
| 80 | 新增: </Setter.Value> | |
| 81 | 新增: </Setter> | |
| 82 | 新增: </Style> | |
| 83 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -21,7 +21,7 @@ | ||
| 21 | 21 | </Grid.RowDefinitions> |
| 22 | 22 | <ContentPresenter Content="{TemplateBinding TopExtContent}"/> |
| 23 | 23 | <Grid Grid.Row="1" Background="Transparent" x:Name="MenuGrid"> |
| 24 | 删除: <Border x:Name="ActiveBlock" Width="5" Height="25" CornerRadius="2" Background="#0067c0" HorizontalAlignment="Left" VerticalAlignment="Top" Panel.ZIndex="9" RenderTransformOrigin="0,0"> | |
| 24 | 新增: <Border x:Name="ActiveBlock" Width="5" Height="25" CornerRadius="2" Background="#2b20d9" HorizontalAlignment="Left" VerticalAlignment="Top" Panel.ZIndex="9" RenderTransformOrigin="0,0"> | |
| 25 | 25 | <Border.RenderTransform> |
| 26 | 26 | <TransformGroup> |
| 27 | 27 | <TranslateTransform X="0" Y="0"></TranslateTransform> |
| @@ -79,7 +79,7 @@ | ||
| 79 | 79 | </Trigger> |
| 80 | 80 | <Trigger Property="IsSelected" Value="True"> |
| 81 | 81 | <!--<Setter Property="Background" Value="White"/>--> |
| 82 | 删除: <Setter TargetName="Title" Property="Foreground" Value="#0067c0"/> | |
| 82 | 新增: <Setter TargetName="Title" Property="Foreground" Value="#2b20d9"/> | |
| 83 | 83 | <Setter TargetName="Title" Property="Visibility" Value="Collapsed"/> |
| 84 | 84 | |
| 85 | 85 | <!--<Setter Property="Visibility" TargetName="CheckMark" Value="Visible"/>--> |
| @@ -0,0 +1,26 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.SettingPanel" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base"> | |
| 5 | 新增: <Style TargetType="{x:Type local:SettingPanel}"> | |
| 6 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 7 | 新增: Value="true" /> | |
| 8 | 新增: | |
| 9 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 10 | 新增: <Setter Property="Template"> | |
| 11 | 新增: <Setter.Value> | |
| 12 | 新增: <ControlTemplate TargetType="{x:Type local:SettingPanel}"> | |
| 13 | 新增: <Border Background="{TemplateBinding Background}" CornerRadius="5" x:Name="Border"> | |
| 14 | 新增: <StackPanel x:Name="Container"> | |
| 15 | 新增: | |
| 16 | 新增: </StackPanel> | |
| 17 | 新增: | |
| 18 | 新增: </Border> | |
| 19 | 新增: <ControlTemplate.Triggers> | |
| 20 | 新增: | |
| 21 | 新增: </ControlTemplate.Triggers> | |
| 22 | 新增: </ControlTemplate> | |
| 23 | 新增: </Setter.Value> | |
| 24 | 新增: </Setter> | |
| 25 | 新增: </Style> | |
| 26 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,47 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.SettingPanel" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base"> | |
| 5 | 新增: <Style TargetType="{x:Type local:SettingPanelItem}"> | |
| 6 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 7 | 新增: Value="true" /> | |
| 8 | 新增: | |
| 9 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 10 | 新增: <Setter Property="Template"> | |
| 11 | 新增: <Setter.Value> | |
| 12 | 新增: <ControlTemplate TargetType="{x:Type local:SettingPanelItem}"> | |
| 13 | 新增: <Border Background="{TemplateBinding Background}" Margin="15,16" x:Name="Border"> | |
| 14 | 新增: | |
| 15 | 新增: <Grid> | |
| 16 | 新增: <Grid.ColumnDefinitions> | |
| 17 | 新增: <ColumnDefinition Width="8*"/> | |
| 18 | 新增: <ColumnDefinition Width="2*"/> | |
| 19 | 新增: | |
| 20 | 新增: </Grid.ColumnDefinitions> | |
| 21 | 新增: | |
| 22 | 新增: <Grid> | |
| 23 | 新增: <StackPanel VerticalAlignment="Center" HorizontalAlignment="Left"> | |
| 24 | 新增: <TextBlock Text="{TemplateBinding Name}" FontSize="14" Foreground="#060606"/> | |
| 25 | 新增: <TextBlock Text="{TemplateBinding Description}" FontSize="12" Margin="0,4,0,0" Foreground="#989CA1"/> | |
| 26 | 新增: </StackPanel> | |
| 27 | 新增: </Grid> | |
| 28 | 新增: <Grid Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Right"> | |
| 29 | 新增: <Border HorizontalAlignment="Left"> | |
| 30 | 新增: <ContentPresenter HorizontalAlignment="Center" | |
| 31 | 新增: VerticalAlignment="Center" | |
| 32 | 新增: RecognizesAccessKey="True" | |
| 33 | 新增: SnapsToDevicePixels="False" Content="{TemplateBinding Content}" | |
| 34 | 新增: /> | |
| 35 | 新增: </Border> | |
| 36 | 新增: </Grid> | |
| 37 | 新增: </Grid> | |
| 38 | 新增: | |
| 39 | 新增: </Border> | |
| 40 | 新增: <ControlTemplate.Triggers> | |
| 41 | 新增: | |
| 42 | 新增: </ControlTemplate.Triggers> | |
| 43 | 新增: </ControlTemplate> | |
| 44 | 新增: </Setter.Value> | |
| 45 | 新增: </Setter> | |
| 46 | 新增: </Style> | |
| 47 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,53 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.SettingPanel" | |
| 4 | 新增: xmlns:base="clr-namespace:UI.Controls.Base" | |
| 5 | 新增: xmlns:btn="clr-namespace:UI.Controls.Button"> | |
| 6 | 新增: <Style TargetType="{x:Type local:SettingPanelMultiItem}"> | |
| 7 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 8 | 新增: Value="true" /> | |
| 9 | 新增: <Setter Property="Margin" Value="0,0,0,20"/> | |
| 10 | 新增: | |
| 11 | 新增: <Setter Property="Background" Value="White"/> | |
| 12 | 新增: <Setter Property="Template"> | |
| 13 | 新增: <Setter.Value> | |
| 14 | 新增: <ControlTemplate TargetType="{x:Type local:SettingPanelMultiItem}"> | |
| 15 | 新增: <Border Background="{TemplateBinding Background}" x:Name="Border" CornerRadius="6" > | |
| 16 | 新增: | |
| 17 | 新增: <Grid> | |
| 18 | 新增: <Grid.RowDefinitions> | |
| 19 | 新增: <RowDefinition Height="auto"/> | |
| 20 | 新增: <RowDefinition Height="*"/> | |
| 21 | 新增: | |
| 22 | 新增: </Grid.RowDefinitions> | |
| 23 | 新增: <Grid Margin="10,10,10,10"> | |
| 24 | 新增: <TextBlock Text="{TemplateBinding Title}" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="16" FontWeight="Bold"/> | |
| 25 | 新增: | |
| 26 | 新增: <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center"> | |
| 27 | 新增: <btn:IconButton ToolTip="收起" x:Name="FoldBtn" Command="{TemplateBinding OnFoldAction}" Icon="ChevronUp" Margin="0"></btn:IconButton> | |
| 28 | 新增: <btn:IconButton Icon="Delete" Command="{TemplateBinding OnRemoveAction}" ToolTip="移除此项"></btn:IconButton> | |
| 29 | 新增: </StackPanel> | |
| 30 | 新增: | |
| 31 | 新增: </Grid> | |
| 32 | 新增: <StackPanel x:Name="Container" Grid.Row="1"> | |
| 33 | 新增: | |
| 34 | 新增: </StackPanel> | |
| 35 | 新增: | |
| 36 | 新增: </Grid> | |
| 37 | 新增: | |
| 38 | 新增: </Border> | |
| 39 | 新增: <ControlTemplate.Triggers> | |
| 40 | 新增: <Trigger Property="Fold" | |
| 41 | 新增: Value="True"> | |
| 42 | 新增: <Setter TargetName="Container" Property="Visibility" Value="Collapsed"/> | |
| 43 | 新增: </Trigger> | |
| 44 | 新增: <Trigger Property="Fold" | |
| 45 | 新增: Value="False"> | |
| 46 | 新增: <Setter TargetName="Container" Property="Visibility" Value="Visible"/> | |
| 47 | 新增: </Trigger> | |
| 48 | 新增: </ControlTemplate.Triggers> | |
| 49 | 新增: </ControlTemplate> | |
| 50 | 新增: </Setter.Value> | |
| 51 | 新增: </Setter> | |
| 52 | 新增: </Style> | |
| 53 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,34 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Tabbar" | |
| 4 | 新增: > | |
| 5 | 新增: <Style TargetType="{x:Type local:Tabbar}"> | |
| 6 | 新增: <Setter Property="SnapsToDevicePixels" | |
| 7 | 新增: Value="true" /> | |
| 8 | 新增: <Setter Property="MinWidth" Value="44"/> | |
| 9 | 新增: <Setter Property="Height" Value="auto"/> | |
| 10 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 11 | 新增: <Setter Property="Template"> | |
| 12 | 新增: <Setter.Value> | |
| 13 | 新增: <ControlTemplate TargetType="{x:Type local:Tabbar}"> | |
| 14 | 新增: <Border Background="{TemplateBinding Background}"> | |
| 15 | 新增: <Grid> | |
| 16 | 新增: <Border x:Name="ActiveBlock" Width="35" Height="4" CornerRadius="2" Background="#2b20d9" HorizontalAlignment="Left" VerticalAlignment="Top" Panel.ZIndex="9" RenderTransformOrigin="0,0"> | |
| 17 | 新增: <Border.RenderTransform> | |
| 18 | 新增: <TransformGroup> | |
| 19 | 新增: <TranslateTransform X="0" Y="0"></TranslateTransform> | |
| 20 | 新增: <ScaleTransform CenterX="0" CenterY="0" ScaleY="1"/> | |
| 21 | 新增: </TransformGroup> | |
| 22 | 新增: </Border.RenderTransform> | |
| 23 | 新增: </Border> | |
| 24 | 新增: <Border Height="30" Margin="0,10,0,20"> | |
| 25 | 新增: <StackPanel Orientation="Horizontal" x:Name="ItemsPanel" VerticalAlignment="Bottom"/> | |
| 26 | 新增: </Border> | |
| 27 | 新增: </Grid> | |
| 28 | 新增: </Border> | |
| 29 | 新增: | |
| 30 | 新增: </ControlTemplate> | |
| 31 | 新增: </Setter.Value> | |
| 32 | 新增: </Setter> | |
| 33 | 新增: </Style> | |
| 34 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,78 @@ | ||
| 1 | 新增:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 2 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 3 | 新增: xmlns:local="clr-namespace:UI.Controls.Toggle"> | |
| 4 | 新增: | |
| 5 | 新增: <Style TargetType="{x:Type local:Toggle}"> | |
| 6 | 新增: <Setter Property="Width" Value="auto"/> | |
| 7 | 新增: <Setter Property="Height" Value="22"/> | |
| 8 | 新增: <Setter Property="Cursor" Value="Hand"/> | |
| 9 | 新增: | |
| 10 | 新增: <Setter Property="Background" Value="Transparent"/> | |
| 11 | 新增: <Setter Property="Template"> | |
| 12 | 新增: <Setter.Value> | |
| 13 | 新增: <ControlTemplate TargetType="{x:Type local:Toggle}"> | |
| 14 | 新增: <Border x:Name="Border" Background="{TemplateBinding Background}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" CornerRadius="4" Margin="{TemplateBinding Margin}"> | |
| 15 | 新增: <Grid> | |
| 16 | 新增: <Grid.ColumnDefinitions> | |
| 17 | 新增: <ColumnDefinition Width="50"/> | |
| 18 | 新增: <ColumnDefinition Width="*"/> | |
| 19 | 新增: </Grid.ColumnDefinitions> | |
| 20 | 新增: <Border x:Name="Button" Background="#f5f5f5" CornerRadius="10" Padding="5"> | |
| 21 | 新增: <Border x:Name="Mark" Width="12" Height="12" CornerRadius="15" Background="#5d5d5d" VerticalAlignment="Center" HorizontalAlignment="Left"> | |
| 22 | 新增: <Border.RenderTransform> | |
| 23 | 新增: <TranslateTransform X="0"/> | |
| 24 | 新增: </Border.RenderTransform> | |
| 25 | 新增: </Border> | |
| 26 | 新增: </Border> | |
| 27 | 新增: <TextBlock x:Name="Text" Grid.Column="1" VerticalAlignment="Center" Margin="10,0,0,0" Text="{TemplateBinding Text}"/> | |
| 28 | 新增: </Grid> | |
| 29 | 新增: | |
| 30 | 新增: <VisualStateManager.VisualStateGroups> | |
| 31 | 新增: <VisualStateGroup x:Name="CommonStates"> | |
| 32 | 新增: <VisualState x:Name="On"> | |
| 33 | 新增: <Storyboard> | |
| 34 | 新增: <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.RenderTransform). | |
| 35 | 新增: (TranslateTransform.X)" | |
| 36 | 新增: Storyboard.TargetName="Mark"> | |
| 37 | 新增: <EasingDoubleKeyFrame KeyTime="00:00:0.2" | |
| 38 | 新增: Value="28" /> | |
| 39 | 新增: </DoubleAnimationUsingKeyFrames> | |
| 40 | 新增: <!--更改标记点颜色--> | |
| 41 | 新增: <ColorAnimationUsingKeyFrames | |
| 42 | 新增: Storyboard.TargetName="Mark" | |
| 43 | 新增: Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"> | |
| 44 | 新增: <EasingColorKeyFrame KeyTime="00:00:0.2" | |
| 45 | 新增: Value="White"/> | |
| 46 | 新增: </ColorAnimationUsingKeyFrames> | |
| 47 | 新增: <!--更改背景颜色--> | |
| 48 | 新增: <ColorAnimationUsingKeyFrames | |
| 49 | 新增: Storyboard.TargetName="Button" | |
| 50 | 新增: Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"> | |
| 51 | 新增: <EasingColorKeyFrame KeyTime="00:00:0.2" | |
| 52 | 新增: Value="#2b20d9"/> | |
| 53 | 新增: </ColorAnimationUsingKeyFrames> | |
| 54 | 新增: </Storyboard> | |
| 55 | 新增: </VisualState> | |
| 56 | 新增: <VisualState x:Name="Off"> | |
| 57 | 新增: <Storyboard> | |
| 58 | 新增: <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.RenderTransform). | |
| 59 | 新增: (TranslateTransform.X)" | |
| 60 | 新增: Storyboard.TargetName="Mark"> | |
| 61 | 新增: <EasingDoubleKeyFrame KeyTime="00:00:0.2" | |
| 62 | 新增: Value="0" /> | |
| 63 | 新增: </DoubleAnimationUsingKeyFrames> | |
| 64 | 新增: </Storyboard> | |
| 65 | 新增: </VisualState> | |
| 66 | 新增: </VisualStateGroup> | |
| 67 | 新增: </VisualStateManager.VisualStateGroups> | |
| 68 | 新增: </Border> | |
| 69 | 新增: <ControlTemplate.Triggers> | |
| 70 | 新增: | |
| 71 | 新增: </ControlTemplate.Triggers> | |
| 72 | 新增: | |
| 73 | 新增: </ControlTemplate> | |
| 74 | 新增: </Setter.Value> | |
| 75 | 新增: </Setter> | |
| 76 | 新增: | |
| 77 | 新增: </Style> | |
| 78 | 新增:</ResourceDictionary> | |
| 文件末尾没有换行 | ||
| @@ -28,14 +28,14 @@ | ||
| 28 | 28 | <!--<Setter Property="Foreground" Value="{DynamicResource ButtonTextDisabled}"/>--> |
| 29 | 29 | </Trigger> |
| 30 | 30 | <Trigger Property="IsMouseOver" Value="True"> |
| 31 | 删除: <Setter Property="Background" Value="{DynamicResource StandardMouseHoverBrush}" /> | |
| 31 | 新增: <Setter Property="Background" Value="#eaeaea" /> | |
| 32 | 32 | <Setter Property="Foreground" Value="{DynamicResource PrimaryColorBrush}"/> |
| 33 | 33 | </Trigger> |
| 34 | 34 | <Trigger Property="IsPressed" Value="True"> |
| 35 | 删除: <Setter Property="Background" Value="{DynamicResource StandardMousePressedBrush}" /> | |
| 35 | 新增: <Setter Property="Background" Value="#2b20d9" /> | |
| 36 | 36 | <!--<Setter Property="Background" Value="{DynamicResource ButtonBackgroundPressed}" /> |
| 37 | 删除: <Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderPressed}"/> | |
| 38 | 删除: <Setter Property="Foreground" Value="{DynamicResource ButtonTextPressed}"/>--> | |
| 37 | 新增: <Setter Property="BorderBrush" Value="{DynamicResource ButtonBorderPressed}"/>--> | |
| 38 | 新增: <Setter Property="Foreground" Value="White"/> | |
| 39 | 39 | </Trigger> |
| 40 | 40 | <Trigger Property="IsFocused" Value="true"> |
| 41 | 41 | <!--<Setter TargetName="Chrome" Property="BorderBrush" Value="{DynamicResource Accent}" />--> |
| @@ -14,6 +14,21 @@ | ||
| 14 | 14 | <WarningLevel>4</WarningLevel> |
| 15 | 15 | <Deterministic>true</Deterministic> |
| 16 | 16 | <TargetFrameworkProfile /> |
| 17 | 新增: <PublishUrl>publish\</PublishUrl> | |
| 18 | 新增: <Install>true</Install> | |
| 19 | 新增: <InstallFrom>Disk</InstallFrom> | |
| 20 | 新增: <UpdateEnabled>false</UpdateEnabled> | |
| 21 | 新增: <UpdateMode>Foreground</UpdateMode> | |
| 22 | 新增: <UpdateInterval>7</UpdateInterval> | |
| 23 | 新增: <UpdateIntervalUnits>Days</UpdateIntervalUnits> | |
| 24 | 新增: <UpdatePeriodically>false</UpdatePeriodically> | |
| 25 | 新增: <UpdateRequired>false</UpdateRequired> | |
| 26 | 新增: <MapFileExtensions>true</MapFileExtensions> | |
| 27 | 新增: <ApplicationRevision>0</ApplicationRevision> | |
| 28 | 新增: <ApplicationVersion>1.0.0.%2a</ApplicationVersion> | |
| 29 | 新增: <IsWebBootstrapper>false</IsWebBootstrapper> | |
| 30 | 新增: <UseApplicationTrust>false</UseApplicationTrust> | |
| 31 | 新增: <BootstrapperEnabled>true</BootstrapperEnabled> | |
| 17 | 32 | </PropertyGroup> |
| 18 | 33 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
| 19 | 34 | <PlatformTarget>AnyCPU</PlatformTarget> |
| @@ -35,7 +50,27 @@ | ||
| 35 | 50 | <WarningLevel>4</WarningLevel> |
| 36 | 51 | </PropertyGroup> |
| 37 | 52 | <PropertyGroup> |
| 38 | 删除: <ApplicationIcon>TextTemplate.ico</ApplicationIcon> | |
| 53 | 新增: <ApplicationIcon>Resources\Icons\tai.ico</ApplicationIcon> | |
| 54 | 新增: </PropertyGroup> | |
| 55 | 新增: <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> | |
| 56 | 新增: <DebugSymbols>true</DebugSymbols> | |
| 57 | 新增: <OutputPath>bin\x64\Debug\</OutputPath> | |
| 58 | 新增: <DefineConstants>DEBUG;TRACE</DefineConstants> | |
| 59 | 新增: <DebugType>full</DebugType> | |
| 60 | 新增: <PlatformTarget>x64</PlatformTarget> | |
| 61 | 新增: <LangVersion>7.3</LangVersion> | |
| 62 | 新增: <ErrorReport>prompt</ErrorReport> | |
| 63 | 新增: <Prefer32Bit>true</Prefer32Bit> | |
| 64 | 新增: </PropertyGroup> | |
| 65 | 新增: <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> | |
| 66 | 新增: <OutputPath>bin\x64\Release\</OutputPath> | |
| 67 | 新增: <DefineConstants>TRACE</DefineConstants> | |
| 68 | 新增: <Optimize>true</Optimize> | |
| 69 | 新增: <DebugType>pdbonly</DebugType> | |
| 70 | 新增: <PlatformTarget>x64</PlatformTarget> | |
| 71 | 新增: <LangVersion>7.3</LangVersion> | |
| 72 | 新增: <ErrorReport>prompt</ErrorReport> | |
| 73 | 新增: <Prefer32Bit>true</Prefer32Bit> | |
| 39 | 74 | </PropertyGroup> |
| 40 | 75 | <ItemGroup> |
| 41 | 76 | <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> |
| @@ -80,18 +115,59 @@ | ||
| 80 | 115 | </ApplicationDefinition> |
| 81 | 116 | <Compile Include="Base\Color\Colors.cs" /> |
| 82 | 117 | <Compile Include="Base\Color\ColorTypes.cs" /> |
| 118 | 新增: <Compile Include="Controls\Base\EmptyData.cs" /> | |
| 119 | 新增: <Compile Include="Controls\Base\Placeholder.cs" /> | |
| 83 | 120 | <Compile Include="Controls\Base\Icon.cs" /> |
| 84 | 121 | <Compile Include="Controls\Base\IconConverter.cs" /> |
| 85 | 122 | <Compile Include="Controls\Base\IconTypes.cs" /> |
| 123 | 新增: <Compile Include="Controls\Button\Button.cs" /> | |
| 124 | 新增: <Compile Include="Controls\Button\IconButton.cs" /> | |
| 125 | 新增: <Compile Include="Controls\Charts\ChartsItemTypeMonth.cs" /> | |
| 126 | 新增: <Compile Include="Controls\Charts\ChartsItemTypeCard.cs" /> | |
| 127 | 新增: <Compile Include="Controls\Charts\ChartsItemTypeA.cs" /> | |
| 128 | 新增: <Compile Include="Controls\Charts\Charts.cs" /> | |
| 129 | 新增: <Compile Include="Controls\Charts\ChartsType.cs" /> | |
| 130 | 新增: <Compile Include="Controls\Charts\Model\ChartsDataModel.cs" /> | |
| 131 | 新增: <Compile Include="Controls\DatePickerBar\DatePickerBarItem.cs" /> | |
| 132 | 新增: <Compile Include="Controls\DatePickerBar\DatePickerShowType.cs" /> | |
| 133 | 新增: <Compile Include="Controls\Input\InputBox.cs" /> | |
| 134 | 新增: <Compile Include="Controls\List\BaseList.cs" /> | |
| 135 | 新增: <Compile Include="Controls\List\BaseListItem.cs" /> | |
| 86 | 136 | <Compile Include="Controls\Navigation\Models\NavigationItemModel.cs" /> |
| 87 | 137 | <Compile Include="Controls\Navigation\Navigation.cs" /> |
| 88 | 138 | <Compile Include="Controls\Navigation\NavigationItem.cs" /> |
| 139 | 新增: <Compile Include="Controls\DatePickerBar\DatePickerBar.cs" /> | |
| 140 | 新增: <Compile Include="Controls\SettingPanel\SettingPanelMultiItem.cs" /> | |
| 141 | 新增: <Compile Include="Controls\SettingPanel\SettingPanelItem.cs" /> | |
| 142 | 新增: <Compile Include="Controls\SettingPanel\SettingPanel.cs" /> | |
| 143 | 新增: <Compile Include="Controls\Tabbar\Tabbar.cs" /> | |
| 144 | 新增: <Compile Include="Controls\Toggle\Toggle.cs" /> | |
| 145 | 新增: <Compile Include="Extensions\ListExtensions.cs" /> | |
| 146 | 新增: <Compile Include="Librays\Image\Imager.cs" /> | |
| 147 | 新增: <Compile Include="Librays\Timer.cs" /> | |
| 148 | 新增: <Compile Include="Models\DataPageModel.cs" /> | |
| 149 | 新增: <Compile Include="Models\DetailPageModel.cs" /> | |
| 150 | 新增: <Compile Include="Models\IndexPageModel.cs" /> | |
| 89 | 151 | <Compile Include="Models\MainWindowModel.cs" /> |
| 152 | 新增: <Compile Include="Models\SettingPageModel.cs" /> | |
| 90 | 153 | <Compile Include="Models\UINotifyPropertyChanged.cs" /> |
| 154 | 新增: <Compile Include="ViewModels\DataPageVM.cs" /> | |
| 155 | 新增: <Compile Include="ViewModels\DetailPageVM.cs" /> | |
| 156 | 新增: <Compile Include="ViewModels\IndexPageVM.cs" /> | |
| 91 | 157 | <Compile Include="ViewModels\MainViewModel.cs" /> |
| 158 | 新增: <Compile Include="ViewModels\SettingPageVM.cs" /> | |
| 159 | 新增: <Compile Include="Views\DataPage.xaml.cs"> | |
| 160 | 新增: <DependentUpon>DataPage.xaml</DependentUpon> | |
| 161 | 新增: </Compile> | |
| 162 | 新增: <Compile Include="Views\DetailPage.xaml.cs"> | |
| 163 | 新增: <DependentUpon>DetailPage.xaml</DependentUpon> | |
| 164 | 新增: </Compile> | |
| 92 | 165 | <Compile Include="Views\IndexPage.xaml.cs"> |
| 93 | 166 | <DependentUpon>IndexPage.xaml</DependentUpon> |
| 94 | 167 | </Compile> |
| 168 | 新增: <Compile Include="Views\SettingPage.xaml.cs"> | |
| 169 | 新增: <DependentUpon>SettingPage.xaml</DependentUpon> | |
| 170 | 新增: </Compile> | |
| 95 | 171 | <Page Include="MainWindow.xaml"> |
| 96 | 172 | <Generator>MSBuild:Compile</Generator> |
| 97 | 173 | <SubType>Designer</SubType> |
| @@ -109,14 +185,82 @@ | ||
| 109 | 185 | <DependentUpon>MainWindow.xaml</DependentUpon> |
| 110 | 186 | <SubType>Code</SubType> |
| 111 | 187 | </Compile> |
| 188 | 新增: <Page Include="Themes\Base\EmptyData.xaml"> | |
| 189 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 190 | 新增: <SubType>Designer</SubType> | |
| 191 | 新增: </Page> | |
| 192 | 新增: <Page Include="Themes\Base\Placeholder.xaml"> | |
| 193 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 194 | 新增: <SubType>Designer</SubType> | |
| 195 | 新增: </Page> | |
| 112 | 196 | <Page Include="Themes\Base\Icon.xaml"> |
| 113 | 197 | <Generator>MSBuild:Compile</Generator> |
| 114 | 198 | <SubType>Designer</SubType> |
| 115 | 199 | </Page> |
| 200 | 新增: <Page Include="Themes\Button\Button.xaml"> | |
| 201 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 202 | 新增: <SubType>Designer</SubType> | |
| 203 | 新增: </Page> | |
| 204 | 新增: <Page Include="Themes\Charts\ChartsItemTypeMonth.xaml"> | |
| 205 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 206 | 新增: <SubType>Designer</SubType> | |
| 207 | 新增: </Page> | |
| 208 | 新增: <Page Include="Themes\Charts\ChartsItemTypeCard.xaml"> | |
| 209 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 210 | 新增: <SubType>Designer</SubType> | |
| 211 | 新增: </Page> | |
| 212 | 新增: <Page Include="Themes\Charts\ChartsItemTypeA.xaml"> | |
| 213 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 214 | 新增: <SubType>Designer</SubType> | |
| 215 | 新增: </Page> | |
| 216 | 新增: <Page Include="Themes\Charts\Charts.xaml"> | |
| 217 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 218 | 新增: <SubType>Designer</SubType> | |
| 219 | 新增: </Page> | |
| 220 | 新增: <Page Include="Themes\DatePickerBar\DatePickerBar.xaml"> | |
| 221 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 222 | 新增: <SubType>Designer</SubType> | |
| 223 | 新增: </Page> | |
| 224 | 新增: <Page Include="Themes\DatePickerBar\DatePickerBarItem.xaml"> | |
| 225 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 226 | 新增: <SubType>Designer</SubType> | |
| 227 | 新增: </Page> | |
| 116 | 228 | <Page Include="Themes\Generic.xaml"> |
| 117 | 229 | <SubType>Designer</SubType> |
| 118 | 230 | <Generator>MSBuild:Compile</Generator> |
| 119 | 231 | </Page> |
| 232 | 新增: <Page Include="Themes\Button\IconButton.xaml"> | |
| 233 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 234 | 新增: <SubType>Designer</SubType> | |
| 235 | 新增: </Page> | |
| 236 | 新增: <Page Include="Themes\Input\InputBox.xaml"> | |
| 237 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 238 | 新增: <SubType>Designer</SubType> | |
| 239 | 新增: </Page> | |
| 240 | 新增: <Page Include="Themes\List\BaseListItem.xaml"> | |
| 241 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 242 | 新增: <SubType>Designer</SubType> | |
| 243 | 新增: </Page> | |
| 244 | 新增: <Page Include="Themes\List\BaseList.xaml"> | |
| 245 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 246 | 新增: <SubType>Designer</SubType> | |
| 247 | 新增: </Page> | |
| 248 | 新增: <Page Include="Themes\SettingPanel\SettingPanelMultiItem.xaml"> | |
| 249 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 250 | 新增: <SubType>Designer</SubType> | |
| 251 | 新增: </Page> | |
| 252 | 新增: <Page Include="Themes\SettingPanel\SettingPanelItem.xaml"> | |
| 253 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 254 | 新增: <SubType>Designer</SubType> | |
| 255 | 新增: </Page> | |
| 256 | 新增: <Page Include="Themes\SettingPanel\SettingPanel.xaml"> | |
| 257 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 258 | 新增: <SubType>Designer</SubType> | |
| 259 | 新增: </Page> | |
| 260 | 新增: <Page Include="Themes\Tabbar\Tabbar.xaml"> | |
| 261 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 262 | 新增: <SubType>Designer</SubType> | |
| 263 | 新增: </Page> | |
| 120 | 264 | <Page Include="Themes\Navigation\Navigation.xaml"> |
| 121 | 265 | <Generator>MSBuild:Compile</Generator> |
| 122 | 266 | <SubType>Designer</SubType> |
| @@ -129,6 +273,10 @@ | ||
| 129 | 273 | <Generator>MSBuild:Compile</Generator> |
| 130 | 274 | <SubType>Designer</SubType> |
| 131 | 275 | </Page> |
| 276 | 新增: <Page Include="Themes\Toggle\Toggle.xaml"> | |
| 277 | 新增: <SubType>Designer</SubType> | |
| 278 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 279 | 新增: </Page> | |
| 132 | 280 | <Page Include="Themes\Window\DefaultWindow.xaml"> |
| 133 | 281 | <SubType>Designer</SubType> |
| 134 | 282 | <Generator>MSBuild:Compile</Generator> |
| @@ -137,10 +285,22 @@ | ||
| 137 | 285 | <SubType>Designer</SubType> |
| 138 | 286 | <Generator>MSBuild:Compile</Generator> |
| 139 | 287 | </Page> |
| 288 | 新增: <Page Include="Views\DataPage.xaml"> | |
| 289 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 290 | 新增: <SubType>Designer</SubType> | |
| 291 | 新增: </Page> | |
| 292 | 新增: <Page Include="Views\DetailPage.xaml"> | |
| 293 | 新增: <SubType>Designer</SubType> | |
| 294 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 295 | 新增: </Page> | |
| 140 | 296 | <Page Include="Views\IndexPage.xaml"> |
| 141 | 297 | <SubType>Designer</SubType> |
| 142 | 298 | <Generator>MSBuild:Compile</Generator> |
| 143 | 299 | </Page> |
| 300 | 新增: <Page Include="Views\SettingPage.xaml"> | |
| 301 | 新增: <SubType>Designer</SubType> | |
| 302 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 303 | 新增: </Page> | |
| 144 | 304 | </ItemGroup> |
| 145 | 305 | <ItemGroup> |
| 146 | 306 | <Compile Include="Properties\AssemblyInfo.cs"> |
| @@ -178,10 +338,22 @@ | ||
| 178 | 338 | </ProjectReference> |
| 179 | 339 | </ItemGroup> |
| 180 | 340 | <ItemGroup> |
| 181 | 删除: <Folder Include="Resources\Icons\" /> | |
| 341 | 新增: <Resource Include="Resources\Icons\tai.ico" /> | |
| 342 | 新增: </ItemGroup> | |
| 343 | 新增: <ItemGroup> | |
| 344 | 新增: <Resource Include="Resources\Icons\defaultIcon.png" /> | |
| 182 | 345 | </ItemGroup> |
| 183 | 346 | <ItemGroup> |
| 184 | 删除: <Resource Include="TextTemplate.ico" /> | |
| 347 | 新增: <BootstrapperPackage Include=".NETFramework,Version=v4.6.1"> | |
| 348 | 新增: <Visible>False</Visible> | |
| 349 | 新增: <ProductName>Microsoft .NET Framework 4.6.1 %28x86 和 x64%29</ProductName> | |
| 350 | 新增: <Install>true</Install> | |
| 351 | 新增: </BootstrapperPackage> | |
| 352 | 新增: <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> | |
| 353 | 新增: <Visible>False</Visible> | |
| 354 | 新增: <ProductName>.NET Framework 3.5 SP1</ProductName> | |
| 355 | 新增: <Install>false</Install> | |
| 356 | 新增: </BootstrapperPackage> | |
| 185 | 357 | </ItemGroup> |
| 186 | 358 | <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
| 187 | 359 | </Project> |
| 文件末尾没有换行 | ||
| @@ -0,0 +1,95 @@ | ||
| 1 | 新增:using Core.Librarys; | |
| 2 | 新增:using Core.Librarys.Image; | |
| 3 | 新增:using Core.Servicers.Interfaces; | |
| 4 | 新增:using System; | |
| 5 | 新增:using System.Collections.Generic; | |
| 6 | 新增:using System.Diagnostics; | |
| 7 | 新增:using System.Drawing; | |
| 8 | 新增:using System.Linq; | |
| 9 | 新增:using System.Text; | |
| 10 | 新增:using System.Threading.Tasks; | |
| 11 | 新增:using System.Windows.Media.Imaging; | |
| 12 | 新增:using UI.Controls; | |
| 13 | 新增:using UI.Controls.Charts.Model; | |
| 14 | 新增:using UI.Librays; | |
| 15 | 新增:using UI.Models; | |
| 16 | 新增:using UI.Views; | |
| 17 | 新增: | |
| 18 | 新增:namespace UI.ViewModels | |
| 19 | 新增:{ | |
| 20 | 新增: public class DataPageVM : DataPageModel | |
| 21 | 新增: { | |
| 22 | 新增: public Command ToDetailCommand { get; set; } | |
| 23 | 新增: private readonly IData data; | |
| 24 | 新增: private readonly MainViewModel main; | |
| 25 | 新增: | |
| 26 | 新增: public DataPageVM(IData data, MainViewModel main) | |
| 27 | 新增: { | |
| 28 | 新增: this.data = data; | |
| 29 | 新增: this.main = main; | |
| 30 | 新增: | |
| 31 | 新增: ToDetailCommand = new Command(new Action<object>(OnTodetailCommand)); | |
| 32 | 新增: | |
| 33 | 新增: Init(); | |
| 34 | 新增: } | |
| 35 | 新增: | |
| 36 | 新增: private void Init() | |
| 37 | 新增: { | |
| 38 | 新增: LoadData(DateTime.Now.Date); | |
| 39 | 新增: PropertyChanged += DataPageVM_PropertyChanged; | |
| 40 | 新增: } | |
| 41 | 新增: | |
| 42 | 新增: private void OnTodetailCommand(object obj) | |
| 43 | 新增: { | |
| 44 | 新增: var data = obj as ChartsDataModel; | |
| 45 | 新增: | |
| 46 | 新增: if (data != null) | |
| 47 | 新增: { | |
| 48 | 新增: main.Data = data; | |
| 49 | 新增: main.Uri = nameof(DetailPage); | |
| 50 | 新增: } | |
| 51 | 新增: } | |
| 52 | 新增: | |
| 53 | 新增: private void DataPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) | |
| 54 | 新增: { | |
| 55 | 新增: if (e.PropertyName == nameof(Date)) | |
| 56 | 新增: { | |
| 57 | 新增: LoadData(Date); | |
| 58 | 新增: } | |
| 59 | 新增: } | |
| 60 | 新增: | |
| 61 | 新增: | |
| 62 | 新增: | |
| 63 | 新增: #region 读取数据 | |
| 64 | 新增: | |
| 65 | 新增: | |
| 66 | 新增: | |
| 67 | 新增: | |
| 68 | 新增: private void LoadData(DateTime date) | |
| 69 | 新增: { | |
| 70 | 新增: var list = data.GetDateRangelogList(date, date); | |
| 71 | 新增: Data = MapToChartsData(list); | |
| 72 | 新增: } | |
| 73 | 新增: | |
| 74 | 新增: #region 处理数据 | |
| 75 | 新增: private List<ChartsDataModel> MapToChartsData(List<Core.Models.DailyLogModel> list) | |
| 76 | 新增: { | |
| 77 | 新增: var resData = new List<ChartsDataModel>(); | |
| 78 | 新增: | |
| 79 | 新增: foreach (var item in list) | |
| 80 | 新增: { | |
| 81 | 新增: var bindModel = new ChartsDataModel(); | |
| 82 | 新增: bindModel.Name = string.IsNullOrEmpty(item.ProcessDescription) ? item.ProcessName : item.ProcessDescription; | |
| 83 | 新增: bindModel.Value = item.Time; | |
| 84 | 新增: bindModel.Tag = Timer.Fromat(item.Time); | |
| 85 | 新增: bindModel.PopupText = item.File; | |
| 86 | 新增: bindModel.Icon = Iconer.Get(item.ProcessName, item.ProcessDescription); | |
| 87 | 新增: resData.Add(bindModel); | |
| 88 | 新增: } | |
| 89 | 新增: | |
| 90 | 新增: return resData; | |
| 91 | 新增: } | |
| 92 | 新增: #endregion | |
| 93 | 新增: #endregion | |
| 94 | 新增: } | |
| 95 | 新增:} | |
| @@ -0,0 +1,127 @@ | ||
| 1 | 新增:using Core.Librarys; | |
| 2 | 新增:using Core.Servicers.Interfaces; | |
| 3 | 新增:using System; | |
| 4 | 新增:using System.Collections.Generic; | |
| 5 | 新增:using System.Linq; | |
| 6 | 新增:using System.Text; | |
| 7 | 新增:using System.Threading.Tasks; | |
| 8 | 新增:using UI.Controls.Charts.Model; | |
| 9 | 新增:using UI.Librays; | |
| 10 | 新增:using UI.Models; | |
| 11 | 新增: | |
| 12 | 新增:namespace UI.ViewModels | |
| 13 | 新增:{ | |
| 14 | 新增: public class DetailPageVM : DetailPageModel | |
| 15 | 新增: { | |
| 16 | 新增: private readonly IData data; | |
| 17 | 新增: private readonly MainViewModel main; | |
| 18 | 新增: public DetailPageVM( | |
| 19 | 新增: IData data, MainViewModel main) | |
| 20 | 新增: { | |
| 21 | 新增: this.data = data; | |
| 22 | 新增: this.main = main; | |
| 23 | 新增: Init(); | |
| 24 | 新增: } | |
| 25 | 新增: | |
| 26 | 新增: private async void Init() | |
| 27 | 新增: { | |
| 28 | 新增: Process = main.Data as ChartsDataModel; | |
| 29 | 新增: | |
| 30 | 新增: Date = DateTime.Now; | |
| 31 | 新增: | |
| 32 | 新增: PropertyChanged += DetailPageVM_PropertyChanged; | |
| 33 | 新增: | |
| 34 | 新增: await LoadData(); | |
| 35 | 新增: | |
| 36 | 新增: await LoadInfo(); | |
| 37 | 新增: } | |
| 38 | 新增: | |
| 39 | 新增: private async void DetailPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) | |
| 40 | 新增: { | |
| 41 | 新增: if (e.PropertyName == nameof(Date)) | |
| 42 | 新增: { | |
| 43 | 新增: await LoadData(); | |
| 44 | 新增: } | |
| 45 | 新增: } | |
| 46 | 新增: | |
| 47 | 新增: private async Task LoadInfo() | |
| 48 | 新增: { | |
| 49 | 新增: await Task.Run(() => | |
| 50 | 新增: { | |
| 51 | 新增: if (Process != null) | |
| 52 | 新增: { | |
| 53 | 新增: var info = data.GetLast(Process.PopupText); | |
| 54 | 新增: if (info != null) | |
| 55 | 新增: { | |
| 56 | 新增: ProcessName = info.ProcessName; | |
| 57 | 新增: | |
| 58 | 新增: } | |
| 59 | 新增: } | |
| 60 | 新增: } | |
| 61 | 新增: ); | |
| 62 | 新增: } | |
| 63 | 新增: | |
| 64 | 新增: private async Task LoadData() | |
| 65 | 新增: { | |
| 66 | 新增: await Task.Run(() => | |
| 67 | 新增: { | |
| 68 | 新增: if (Process != null) | |
| 69 | 新增: { | |
| 70 | 新增: var monthData = data.GetProcessMonthLogList(Process.PopupText, Date); | |
| 71 | 新增: int monthTotal = monthData.Sum(m => m.Time); | |
| 72 | 新增: Total = Timer.Fromat(monthTotal); | |
| 73 | 新增: | |
| 74 | 新增: DateTime start = new DateTime(Date.Year, Date.Month, 1); | |
| 75 | 新增: DateTime end = new DateTime(Date.Year, Date.Month, DateTime.DaysInMonth(Date.Year, Date.Month)); | |
| 76 | 新增: var monthAllData = data.GetDateRangelogList(start, end); | |
| 77 | 新增: | |
| 78 | 新增: LongDay = "暂无数据"; | |
| 79 | 新增: if (monthData.Count > 0) | |
| 80 | 新增: { | |
| 81 | 新增: var longDayData = monthData.OrderByDescending(m => m.Time).FirstOrDefault(); | |
| 82 | 新增: LongDay = longDayData.Date.ToString("最长一天是在 dd 日,使用了 " + Timer.Fromat(longDayData.Time)); | |
| 83 | 新增: | |
| 84 | 新增: } | |
| 85 | 新增: | |
| 86 | 新增: | |
| 87 | 新增: int monthAllTotal = monthAllData.Sum(m => m.Time); | |
| 88 | 新增: if (monthAllTotal > 0) | |
| 89 | 新增: { | |
| 90 | 新增: Ratio = (((double)monthTotal / (double)monthAllTotal)).ToString("P"); | |
| 91 | 新增: } | |
| 92 | 新增: else | |
| 93 | 新增: { | |
| 94 | 新增: Ratio = "暂无数据"; | |
| 95 | 新增: } | |
| 96 | 新增: Data = MapToChartsData(monthData); | |
| 97 | 新增: if (Data.Count == 0) | |
| 98 | 新增: { | |
| 99 | 新增: Data.Add(new ChartsDataModel() | |
| 100 | 新增: { | |
| 101 | 新增: DateTime = Date, | |
| 102 | 新增: }); | |
| 103 | 新增: } | |
| 104 | 新增: } | |
| 105 | 新增: }); | |
| 106 | 新增: } | |
| 107 | 新增: | |
| 108 | 新增: private List<ChartsDataModel> MapToChartsData(List<Core.Models.DailyLogModel> list) | |
| 109 | 新增: { | |
| 110 | 新增: var resData = new List<ChartsDataModel>(); | |
| 111 | 新增: | |
| 112 | 新增: foreach (var item in list) | |
| 113 | 新增: { | |
| 114 | 新增: var bindModel = new ChartsDataModel(); | |
| 115 | 新增: bindModel.Name = string.IsNullOrEmpty(item.ProcessDescription) ? item.ProcessName : item.ProcessDescription; | |
| 116 | 新增: bindModel.Value = item.Time; | |
| 117 | 新增: bindModel.Tag = Timer.Fromat(item.Time); | |
| 118 | 新增: bindModel.PopupText = item.File; | |
| 119 | 新增: bindModel.Icon = Iconer.Get(item.ProcessName, item.ProcessDescription); | |
| 120 | 新增: bindModel.DateTime = item.Date; | |
| 121 | 新增: resData.Add(bindModel); | |
| 122 | 新增: } | |
| 123 | 新增: | |
| 124 | 新增: return resData; | |
| 125 | 新增: } | |
| 126 | 新增: } | |
| 127 | 新增:} | |
| @@ -0,0 +1,144 @@ | ||
| 1 | 新增:using Core.Librarys; | |
| 2 | 新增:using Core.Librarys.Image; | |
| 3 | 新增:using Core.Servicers.Interfaces; | |
| 4 | 新增:using System; | |
| 5 | 新增:using System.Collections.Generic; | |
| 6 | 新增:using System.Diagnostics; | |
| 7 | 新增:using System.Drawing; | |
| 8 | 新增:using System.Linq; | |
| 9 | 新增:using System.Text; | |
| 10 | 新增:using System.Threading.Tasks; | |
| 11 | 新增:using System.Windows.Media.Imaging; | |
| 12 | 新增:using UI.Controls; | |
| 13 | 新增:using UI.Controls.Charts.Model; | |
| 14 | 新增:using UI.Librays; | |
| 15 | 新增:using UI.Models; | |
| 16 | 新增:using UI.Views; | |
| 17 | 新增: | |
| 18 | 新增:namespace UI.ViewModels | |
| 19 | 新增:{ | |
| 20 | 新增: public class IndexPageVM : IndexPageModel | |
| 21 | 新增: { | |
| 22 | 新增: public Command ToDetailCommand { get; set; } | |
| 23 | 新增: private readonly IData data; | |
| 24 | 新增: private readonly MainViewModel main; | |
| 25 | 新增: private readonly IMain mainServicer; | |
| 26 | 新增: public IndexPageVM( | |
| 27 | 新增: IData data, MainViewModel main, IMain mainServicer) | |
| 28 | 新增: { | |
| 29 | 新增: this.data = data; | |
| 30 | 新增: this.main = main; | |
| 31 | 新增: this.mainServicer = mainServicer; | |
| 32 | 新增: | |
| 33 | 新增: ToDetailCommand = new Command(new Action<object>(OnTodetailCommand)); | |
| 34 | 新增: | |
| 35 | 新增: mainServicer.OnUpdateTime += MainServicer_OnUpdateTime; | |
| 36 | 新增: Init(); | |
| 37 | 新增: } | |
| 38 | 新增: | |
| 39 | 新增: private void MainServicer_OnUpdateTime(object sender, EventArgs e) | |
| 40 | 新增: { | |
| 41 | 新增: if (TabbarSelectedIndex == 1) | |
| 42 | 新增: { | |
| 43 | 新增: LoadThisWeekData(); | |
| 44 | 新增: } | |
| 45 | 新增: } | |
| 46 | 新增: | |
| 47 | 新增: private void Init() | |
| 48 | 新增: { | |
| 49 | 新增: TabbarData = new System.Collections.ObjectModel.ObservableCollection<string>() | |
| 50 | 新增: { | |
| 51 | 新增: "上周","本周" | |
| 52 | 新增: }; | |
| 53 | 新增: | |
| 54 | 新增: TabbarSelectedIndex = 1; | |
| 55 | 新增: PropertyChanged += IndexPageVM_PropertyChanged; | |
| 56 | 新增: LoadThisWeekData(); | |
| 57 | 新增: } | |
| 58 | 新增: | |
| 59 | 新增: private void OnTodetailCommand(object obj) | |
| 60 | 新增: { | |
| 61 | 新增: var data = obj as ChartsDataModel; | |
| 62 | 新增: | |
| 63 | 新增: if (data != null) | |
| 64 | 新增: { | |
| 65 | 新增: main.Data = data; | |
| 66 | 新增: main.Uri = nameof(DetailPage); | |
| 67 | 新增: } | |
| 68 | 新增: } | |
| 69 | 新增: | |
| 70 | 新增: private void IndexPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) | |
| 71 | 新增: { | |
| 72 | 新增: if (e.PropertyName == nameof(TabbarSelectedIndex)) | |
| 73 | 新增: { | |
| 74 | 新增: if (TabbarSelectedIndex == 1) | |
| 75 | 新增: { | |
| 76 | 新增: LoadThisWeekData(); | |
| 77 | 新增: } | |
| 78 | 新增: else | |
| 79 | 新增: { | |
| 80 | 新增: LoadLastWeekData(); | |
| 81 | 新增: } | |
| 82 | 新增: } | |
| 83 | 新增: } | |
| 84 | 新增: | |
| 85 | 新增: #region 读取数据 | |
| 86 | 新增: | |
| 87 | 新增: #region 本周数据 | |
| 88 | 新增: private async void LoadThisWeekData() | |
| 89 | 新增: { | |
| 90 | 新增: IsLoading = true; | |
| 91 | 新增: | |
| 92 | 新增: var task = Task.Run(() => | |
| 93 | 新增: { | |
| 94 | 新增: var list = data.GetThisWeeklogList(); | |
| 95 | 新增: var res = MapToChartsData(list); | |
| 96 | 新增: IsLoading = false; | |
| 97 | 新增: return res; | |
| 98 | 新增: | |
| 99 | 新增: }); | |
| 100 | 新增: | |
| 101 | 新增: WeekData = await task; | |
| 102 | 新增: | |
| 103 | 新增: } | |
| 104 | 新增: #endregion | |
| 105 | 新增: | |
| 106 | 新增: | |
| 107 | 新增: #region 上周数据 | |
| 108 | 新增: private async void LoadLastWeekData() | |
| 109 | 新增: { | |
| 110 | 新增: IsLoading = true; | |
| 111 | 新增: var task = Task.Run(() => | |
| 112 | 新增: { | |
| 113 | 新增: var list = data.GetLastWeeklogList(); | |
| 114 | 新增: var res = MapToChartsData(list); | |
| 115 | 新增: IsLoading = false; | |
| 116 | 新增: return res; | |
| 117 | 新增: }); | |
| 118 | 新增: WeekData = await task; | |
| 119 | 新增: } | |
| 120 | 新增: #endregion | |
| 121 | 新增: | |
| 122 | 新增: #region 处理数据 | |
| 123 | 新增: private List<ChartsDataModel> MapToChartsData(List<Core.Models.DailyLogModel> list) | |
| 124 | 新增: { | |
| 125 | 新增: var resData = new List<ChartsDataModel>(); | |
| 126 | 新增: | |
| 127 | 新增: foreach (var item in list) | |
| 128 | 新增: { | |
| 129 | 新增: var bindModel = new ChartsDataModel(); | |
| 130 | 新增: bindModel.Name = string.IsNullOrEmpty(item.ProcessDescription) ? item.ProcessName : item.ProcessDescription; | |
| 131 | 新增: bindModel.Value = item.Time; | |
| 132 | 新增: bindModel.Tag = Timer.Fromat(item.Time); | |
| 133 | 新增: bindModel.PopupText = item.File; | |
| 134 | 新增: bindModel.Icon = Iconer.Get(item.ProcessName, item.ProcessDescription); | |
| 135 | 新增: bindModel.DateTime = item.Date; | |
| 136 | 新增: resData.Add(bindModel); | |
| 137 | 新增: } | |
| 138 | 新增: | |
| 139 | 新增: return resData; | |
| 140 | 新增: } | |
| 141 | 新增: #endregion | |
| 142 | 新增: #endregion | |
| 143 | 新增: } | |
| 144 | 新增:} | |
| @@ -79,8 +79,9 @@ namespace UI.ViewModels | ||
| 79 | 79 | Items.Add(new Controls.Navigation.Models.NavigationItemModel() |
| 80 | 80 | { |
| 81 | 81 | Icon = Controls.Base.IconTypes.BIDashboard, |
| 82 | 删除: Title = "统计", | |
| 83 | 删除: ID = 1 | |
| 82 | 新增: Title = "每日", | |
| 83 | 新增: ID = 1, | |
| 84 | 新增: Uri = nameof(DataPage), | |
| 84 | 85 | |
| 85 | 86 | }); |
| 86 | 87 | NavSelectedItem = Items[0]; |
| @@ -0,0 +1,87 @@ | ||
| 1 | 新增:using Core.Models.Config; | |
| 2 | 新增:using Core.Models.Config.Link; | |
| 3 | 新增:using Core.Servicers.Interfaces; | |
| 4 | 新增:using System; | |
| 5 | 新增:using System.Collections.Generic; | |
| 6 | 新增:using System.Diagnostics; | |
| 7 | 新增:using System.Linq; | |
| 8 | 新增:using System.Reflection; | |
| 9 | 新增:using System.Text; | |
| 10 | 新增:using System.Threading.Tasks; | |
| 11 | 新增:using UI.Models; | |
| 12 | 新增: | |
| 13 | 新增:namespace UI.ViewModels | |
| 14 | 新增:{ | |
| 15 | 新增: public class SettingPageVM : SettingPageModel | |
| 16 | 新增: { | |
| 17 | 新增: private ConfigModel config; | |
| 18 | 新增: private readonly IAppConfig appConfig; | |
| 19 | 新增: public SettingPageVM(IAppConfig appConfig) | |
| 20 | 新增: { | |
| 21 | 新增: this.appConfig = appConfig; | |
| 22 | 新增: | |
| 23 | 新增: | |
| 24 | 新增: Init(); | |
| 25 | 新增: | |
| 26 | 新增: } | |
| 27 | 新增: | |
| 28 | 新增: private void Init() | |
| 29 | 新增: { | |
| 30 | 新增: config = appConfig.GetConfig(); | |
| 31 | 新增: | |
| 32 | 新增: Data = config.General; | |
| 33 | 新增: | |
| 34 | 新增: TabbarData = new System.Collections.ObjectModel.ObservableCollection<string>() | |
| 35 | 新增: { | |
| 36 | 新增: "常规","关联","关于" | |
| 37 | 新增: }; | |
| 38 | 新增: | |
| 39 | 新增: PropertyChanged += SettingPageVM_PropertyChanged; | |
| 40 | 新增: | |
| 41 | 新增: Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); | |
| 42 | 新增: } | |
| 43 | 新增: | |
| 44 | 新增: | |
| 45 | 新增: | |
| 46 | 新增: private void SettingPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) | |
| 47 | 新增: { | |
| 48 | 新增: if (e.PropertyName == nameof(Data)) | |
| 49 | 新增: { | |
| 50 | 新增: if (TabbarSelectedIndex == 0) | |
| 51 | 新增: { | |
| 52 | 新增: config.General = Data as GeneralModel; | |
| 53 | 新增: } | |
| 54 | 新增: else if (TabbarSelectedIndex == 1) | |
| 55 | 新增: { | |
| 56 | 新增: if (Data != null) | |
| 57 | 新增: { | |
| 58 | 新增: var newData = new List<LinkModel>(); | |
| 59 | 新增: foreach (var item in Data as IEnumerable<object>) | |
| 60 | 新增: { | |
| 61 | 新增: newData.Add(item as LinkModel); | |
| 62 | 新增: Debug.WriteLine(item.ToString()); | |
| 63 | 新增: } | |
| 64 | 新增: config.Links = newData; | |
| 65 | 新增: } | |
| 66 | 新增: | |
| 67 | 新增: } | |
| 68 | 新增: | |
| 69 | 新增: appConfig.Save(); | |
| 70 | 新增: } | |
| 71 | 新增: | |
| 72 | 新增: if (e.PropertyName == nameof(TabbarSelectedIndex)) | |
| 73 | 新增: { | |
| 74 | 新增: if (TabbarSelectedIndex == 0) | |
| 75 | 新增: { | |
| 76 | 新增: // 常规 | |
| 77 | 新增: Data = config.General; | |
| 78 | 新增: } | |
| 79 | 新增: else if (TabbarSelectedIndex == 1) | |
| 80 | 新增: { | |
| 81 | 新增: // 关联 | |
| 82 | 新增: Data = config.Links; | |
| 83 | 新增: } | |
| 84 | 新增: } | |
| 85 | 新增: } | |
| 86 | 新增: } | |
| 87 | 新增:} | |
| @@ -0,0 +1,40 @@ | ||
| 1 | 新增:<Page | |
| 2 | 新增: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 3 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 4 | 新增: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |
| 5 | 新增: xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |
| 6 | 新增: xmlns:local="clr-namespace:UI.Views" | |
| 7 | 新增: xmlns:Charts="clr-namespace:UI.Controls.Charts" xmlns:Tabbar="clr-namespace:UI.Controls.Tabbar" xmlns:DatePickerBar="clr-namespace:UI.Controls.DatePickerBar" x:Class="UI.Views.DataPage" | |
| 8 | 新增: mc:Ignorable="d" | |
| 9 | 新增: d:DesignHeight="450" d:DesignWidth="800" | |
| 10 | 新增: Title="IndexPage"> | |
| 11 | 新增: | |
| 12 | 新增: <Grid> | |
| 13 | 新增: <StackPanel Margin="20"> | |
| 14 | 新增: <TextBlock Text="每日" FontSize="18" Margin="0,5,0,20"/> | |
| 15 | 新增: | |
| 16 | 新增: <!--<Border Width="60" Height="60" HorizontalAlignment="Left" RenderTransformOrigin="1,0.5"> | |
| 17 | 新增: <Border.Effect> | |
| 18 | 新增: <DropShadowEffect BlurRadius="4" ShadowDepth="0" Direction="0" Opacity="1"/> | |
| 19 | 新增: </Border.Effect> | |
| 20 | 新增: <Border.Background> | |
| 21 | 新增: <LinearGradientBrush EndPoint="2,1" StartPoint="-2,0"> | |
| 22 | 新增: <GradientStop Color="#FFEE0357"/> | |
| 23 | 新增: <GradientStop Color="#FF2B20D9" Offset="1"/> | |
| 24 | 新增: </LinearGradientBrush> | |
| 25 | 新增: </Border.Background> | |
| 26 | 新增: | |
| 27 | 新增: </Border>--> | |
| 28 | 新增: <!--<TextBlock Text="按月统计" FontSize="18" Margin="0,5,0,10"/>--> | |
| 29 | 新增: <DatePickerBar:DatePickerBar SelectedDate="{Binding Date,Mode=TwoWay}"/> | |
| 30 | 新增: | |
| 31 | 新增: <Charts:Charts Data="{Binding Data}" ChartsType="HorizontalA" Margin="0,20,0,0" ClickCommand="{Binding ToDetailCommand}"/> | |
| 32 | 新增: | |
| 33 | 新增: | |
| 34 | 新增: | |
| 35 | 新增: | |
| 36 | 新增: | |
| 37 | 新增: | |
| 38 | 新增: </StackPanel> | |
| 39 | 新增: </Grid> | |
| 40 | 新增:</Page> | |
| @@ -0,0 +1,30 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增:using System.Windows.Data; | |
| 9 | 新增:using System.Windows.Documents; | |
| 10 | 新增:using System.Windows.Input; | |
| 11 | 新增:using System.Windows.Media; | |
| 12 | 新增:using System.Windows.Media.Imaging; | |
| 13 | 新增:using System.Windows.Navigation; | |
| 14 | 新增:using System.Windows.Shapes; | |
| 15 | 新增:using UI.Controls.Charts.Model; | |
| 16 | 新增: | |
| 17 | 新增:namespace UI.Views | |
| 18 | 新增:{ | |
| 19 | 新增: /// <summary> | |
| 20 | 新增: /// IndexPage.xaml 的交互逻辑 | |
| 21 | 新增: /// </summary> | |
| 22 | 新增: public partial class DataPage : Page | |
| 23 | 新增: { | |
| 24 | 新增: public DataPage() | |
| 25 | 新增: { | |
| 26 | 新增: InitializeComponent(); | |
| 27 | 新增: | |
| 28 | 新增: } | |
| 29 | 新增: } | |
| 30 | 新增:} | |
| @@ -0,0 +1,72 @@ | ||
| 1 | 新增:<Page | |
| 2 | 新增: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 3 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 4 | 新增: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |
| 5 | 新增: xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |
| 6 | 新增: xmlns:local="clr-namespace:UI.Views" xmlns:Charts="clr-namespace:UI.Controls.Charts" | |
| 7 | 新增: xmlns:DatePickerBar="clr-namespace:UI.Controls.DatePickerBar" x:Class="UI.Views.DetailPage" | |
| 8 | 新增: mc:Ignorable="d" | |
| 9 | 新增: d:DesignHeight="450" d:DesignWidth="800" | |
| 10 | 新增: Title="DetailPage"> | |
| 11 | 新增: | |
| 12 | 新增: <Grid> | |
| 13 | 新增: <StackPanel Margin="20"> | |
| 14 | 新增: <TextBlock Text="查看" FontSize="18" Margin="0,0,0,20"/> | |
| 15 | 新增: | |
| 16 | 新增: <Border | |
| 17 | 新增: Background="White" | |
| 18 | 新增: CornerRadius="12" | |
| 19 | 新增: Padding="0,20"> | |
| 20 | 新增: <Grid> | |
| 21 | 新增: <Grid.ColumnDefinitions> | |
| 22 | 新增: <ColumnDefinition Width="100"/> | |
| 23 | 新增: <ColumnDefinition Width="9*"/> | |
| 24 | 新增: | |
| 25 | 新增: </Grid.ColumnDefinitions> | |
| 26 | 新增: <Image Source="{Binding Process.Icon}" Width="25" HorizontalAlignment="Center" VerticalAlignment="Center"/> | |
| 27 | 新增: | |
| 28 | 新增: <StackPanel Grid.Column="1" VerticalAlignment="Center"> | |
| 29 | 新增: <StackPanel Orientation="Horizontal"> | |
| 30 | 新增: <TextBlock Text="{Binding Process.Name}" FontSize="18" /> | |
| 31 | 新增: <TextBlock ToolTip="进程名" Text="{Binding ProcessName}" FontSize="12" Foreground="Gray" VerticalAlignment="Center" Margin="15,0,0,0"/> | |
| 32 | 新增: | |
| 33 | 新增: </StackPanel> | |
| 34 | 新增: <TextBlock ToolTip="进程文件路径" Foreground="Gray" Text="{Binding Process.PopupText}" Margin="0,5,0,0" TextWrapping="WrapWithOverflow"/> | |
| 35 | 新增: | |
| 36 | 新增: </StackPanel> | |
| 37 | 新增: </Grid> | |
| 38 | 新增: </Border> | |
| 39 | 新增: | |
| 40 | 新增: <Border | |
| 41 | 新增: Background="White" | |
| 42 | 新增: CornerRadius="12" | |
| 43 | 新增: Padding="20,20" | |
| 44 | 新增: Margin="0,20,0,0"> | |
| 45 | 新增: <StackPanel> | |
| 46 | 新增: <DatePickerBar:DatePickerBar ShowType="Month" HorizontalAlignment="Left" SelectedDate="{Binding Date,Mode=TwoWay}"/> | |
| 47 | 新增: | |
| 48 | 新增: <Grid Margin="0,20,0,0"> | |
| 49 | 新增: <Grid.ColumnDefinitions> | |
| 50 | 新增: <ColumnDefinition Width="256"/> | |
| 51 | 新增: <ColumnDefinition Width="9*"/> | |
| 52 | 新增: | |
| 53 | 新增: </Grid.ColumnDefinitions> | |
| 54 | 新增: <Charts:Charts Data="{Binding Data}" ChartsType="Month" HorizontalAlignment="Left"/> | |
| 55 | 新增: <StackPanel Grid.Column="1"> | |
| 56 | 新增: <TextBlock FontSize="14"><Run Text="该月累计使用"/><Run Text="{Binding Total}"/> | |
| 57 | 新增: </TextBlock> | |
| 58 | 新增: <TextBlock Foreground="Gray" Margin="0,5,0,0" FontSize="14"><Run Text="{Binding LongDay}"/> | |
| 59 | 新增: </TextBlock> | |
| 60 | 新增: <TextBlock Text="在当月所有使用应用时长中占比" FontSize="14" Margin="0,20,0,0"/> | |
| 61 | 新增: | |
| 62 | 新增: <TextBlock Margin="0,10,0,0" FontSize="24"><Run Text="{Binding Ratio}"/> | |
| 63 | 新增: </TextBlock> | |
| 64 | 新增: | |
| 65 | 新增: </StackPanel> | |
| 66 | 新增: </Grid> | |
| 67 | 新增: </StackPanel> | |
| 68 | 新增: </Border> | |
| 69 | 新增: | |
| 70 | 新增: </StackPanel> | |
| 71 | 新增: </Grid> | |
| 72 | 新增:</Page> | |
| @@ -0,0 +1,28 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增:using System.Windows.Data; | |
| 9 | 新增:using System.Windows.Documents; | |
| 10 | 新增:using System.Windows.Input; | |
| 11 | 新增:using System.Windows.Media; | |
| 12 | 新增:using System.Windows.Media.Imaging; | |
| 13 | 新增:using System.Windows.Navigation; | |
| 14 | 新增:using System.Windows.Shapes; | |
| 15 | 新增: | |
| 16 | 新增:namespace UI.Views | |
| 17 | 新增:{ | |
| 18 | 新增: /// <summary> | |
| 19 | 新增: /// DetailPage.xaml 的交互逻辑 | |
| 20 | 新增: /// </summary> | |
| 21 | 新增: public partial class DetailPage : Page | |
| 22 | 新增: { | |
| 23 | 新增: public DetailPage() | |
| 24 | 新增: { | |
| 25 | 新增: InitializeComponent(); | |
| 26 | 新增: } | |
| 27 | 新增: } | |
| 28 | 新增:} | |
| @@ -1,14 +1,36 @@ | ||
| 1 | 删除:<Page x:Class="UI.Views.IndexPage" | |
| 1 | 新增:<Page | |
| 2 | 2 | xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
| 3 | 3 | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
| 4 | 4 | xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
| 5 | 5 | xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
| 6 | 6 | xmlns:local="clr-namespace:UI.Views" |
| 7 | 新增: xmlns:Charts="clr-namespace:UI.Controls.Charts" xmlns:Tabbar="clr-namespace:UI.Controls.Tabbar" x:Class="UI.Views.IndexPage" | |
| 7 | 8 | mc:Ignorable="d" |
| 8 | 9 | d:DesignHeight="450" d:DesignWidth="800" |
| 9 | 10 | Title="IndexPage"> |
| 10 | 11 | |
| 11 | 12 | <Grid> |
| 12 | 删除: | |
| 13 | 新增: <StackPanel Margin="20"> | |
| 14 | 新增: <!--<Border Width="60" Height="60" HorizontalAlignment="Left" RenderTransformOrigin="1,0.5"> | |
| 15 | 新增: <Border.Effect> | |
| 16 | 新增: <DropShadowEffect BlurRadius="4" ShadowDepth="0" Direction="0" Opacity="1"/> | |
| 17 | 新增: </Border.Effect> | |
| 18 | 新增: <Border.Background> | |
| 19 | 新增: <LinearGradientBrush EndPoint="2,1" StartPoint="-2,0"> | |
| 20 | 新增: <GradientStop Color="#FFEE0357"/> | |
| 21 | 新增: <GradientStop Color="#FF2B20D9" Offset="1"/> | |
| 22 | 新增: </LinearGradientBrush> | |
| 23 | 新增: </Border.Background> | |
| 24 | 新增: | |
| 25 | 新增: </Border>--> | |
| 26 | 新增: <TextBlock Text="概览" FontSize="18" Margin="0,5,0,20"/> | |
| 27 | 新增: <Tabbar:Tabbar Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}"/> | |
| 28 | 新增: <TextBlock Text="最为频繁" FontSize="15" Margin="0,5,0,10"/> | |
| 29 | 新增: <Charts:Charts Data="{Binding WeekData}" ChartsType="HorizontalA" ShowLimit="3" IsLoading="{Binding IsLoading,Mode=TwoWay}" ClickCommand="{Binding ToDetailCommand}"/> | |
| 30 | 新增: <TextBlock Text="更多" FontSize="15" Margin="0,20,0,10"/> | |
| 31 | 新增: <Charts:Charts Data="{Binding WeekData}" ChartsType="Card" ShowLimit="12" IsLoading="{Binding IsLoading,Mode=TwoWay}" ClickCommand="{Binding ToDetailCommand}"/> | |
| 32 | 新增: | |
| 33 | 新增: | |
| 34 | 新增: </StackPanel> | |
| 13 | 35 | </Grid> |
| 14 | 36 | </Page> |
| @@ -12,6 +12,7 @@ using System.Windows.Media; | ||
| 12 | 12 | using System.Windows.Media.Imaging; |
| 13 | 13 | using System.Windows.Navigation; |
| 14 | 14 | using System.Windows.Shapes; |
| 15 | 新增:using UI.Controls.Charts.Model; | |
| 15 | 16 | |
| 16 | 17 | namespace UI.Views |
| 17 | 18 | { |
| @@ -23,6 +24,7 @@ namespace UI.Views | ||
| 23 | 24 | public IndexPage() |
| 24 | 25 | { |
| 25 | 26 | InitializeComponent(); |
| 27 | 新增: | |
| 26 | 28 | } |
| 27 | 29 | } |
| 28 | 30 | } |
| @@ -0,0 +1,63 @@ | ||
| 1 | 新增:<Page | |
| 2 | 新增: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
| 3 | 新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
| 4 | 新增: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |
| 5 | 新增: xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |
| 6 | 新增: xmlns:local="clr-namespace:UI.Views" | |
| 7 | 新增: xmlns:SettingPanel="clr-namespace:UI.Controls.SettingPanel" x:Class="UI.Views.SettingPage" | |
| 8 | 新增: mc:Ignorable="d" | |
| 9 | 新增: d:DesignHeight="450" d:DesignWidth="800" | |
| 10 | 新增: Title="SettingPage" | |
| 11 | 新增: xmlns:Tabbar="clr-namespace:UI.Controls.Tabbar" | |
| 12 | 新增: xmlns:Btn="clr-namespace:UI.Controls.Button"> | |
| 13 | 新增: | |
| 14 | 新增: <Grid Margin="20"> | |
| 15 | 新增: <StackPanel> | |
| 16 | 新增: <TextBlock Text="设置" FontSize="18" Margin="0,5,0,20"/> | |
| 17 | 新增: <Tabbar:Tabbar Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}"/> | |
| 18 | 新增: | |
| 19 | 新增: <TabControl | |
| 20 | 新增: SelectedIndex="{Binding TabbarSelectedIndex}" | |
| 21 | 新增: BorderThickness="0" | |
| 22 | 新增: Margin="0" | |
| 23 | 新增: Padding="0" | |
| 24 | 新增: Background="Transparent" | |
| 25 | 新增: > | |
| 26 | 新增: <TabControl.Resources> | |
| 27 | 新增: <Style TargetType="TabItem"> | |
| 28 | 新增: <Setter Property="Template"> | |
| 29 | 新增: <Setter.Value> | |
| 30 | 新增: <ControlTemplate TargetType="TabItem"> | |
| 31 | 新增: </ControlTemplate> | |
| 32 | 新增: </Setter.Value> | |
| 33 | 新增: </Setter> | |
| 34 | 新增: </Style> | |
| 35 | 新增: | |
| 36 | 新增: </TabControl.Resources> | |
| 37 | 新增: <TabItem> | |
| 38 | 新增: <SettingPanel:SettingPanel Data="{Binding Data,Mode=TwoWay}" /> | |
| 39 | 新增: </TabItem> | |
| 40 | 新增: <TabItem> | |
| 41 | 新增: <SettingPanel:SettingPanel Data="{Binding Data,Mode=TwoWay}" Margin="0,0,0,10"/> | |
| 42 | 新增: </TabItem> | |
| 43 | 新增: <TabItem> | |
| 44 | 新增: <!--关于--> | |
| 45 | 新增: <Border Background="White" Padding="20" CornerRadius="6"> | |
| 46 | 新增: <StackPanel HorizontalAlignment="Left"> | |
| 47 | 新增: <Image Width="25" Source="/Resources/Icons/tai.ico" HorizontalAlignment="Left"/> | |
| 48 | 新增: <TextBlock Margin="0,20,0,0"> | |
| 49 | 新增: <Run Text="Tai "/><Run Text="{Binding Version}"/> | |
| 50 | 新增: </TextBlock> | |
| 51 | 新增: | |
| 52 | 新增: <TextBlock Margin="0,30,0,0"> | |
| 53 | 新增: <Run Text="外部资源声明 "/> | |
| 54 | 新增: </TextBlock> | |
| 55 | 新增: <TextBlock Margin="0,5,0,0" Text="Icon 来自微软 Emoji"/> | |
| 56 | 新增: </StackPanel> | |
| 57 | 新增: </Border> | |
| 58 | 新增: </TabItem> | |
| 59 | 新增: </TabControl> | |
| 60 | 新增: </StackPanel> | |
| 61 | 新增: | |
| 62 | 新增: </Grid> | |
| 63 | 新增:</Page> | |
| @@ -0,0 +1,28 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using System.Windows; | |
| 7 | 新增:using System.Windows.Controls; | |
| 8 | 新增:using System.Windows.Data; | |
| 9 | 新增:using System.Windows.Documents; | |
| 10 | 新增:using System.Windows.Input; | |
| 11 | 新增:using System.Windows.Media; | |
| 12 | 新增:using System.Windows.Media.Imaging; | |
| 13 | 新增:using System.Windows.Navigation; | |
| 14 | 新增:using System.Windows.Shapes; | |
| 15 | 新增: | |
| 16 | 新增:namespace UI.Views | |
| 17 | 新增:{ | |
| 18 | 新增: /// <summary> | |
| 19 | 新增: /// SettingPage.xaml 的交互逻辑 | |
| 20 | 新增: /// </summary> | |
| 21 | 新增: public partial class SettingPage : Page | |
| 22 | 新增: { | |
| 23 | 新增: public SettingPage() | |
| 24 | 新增: { | |
| 25 | 新增: InitializeComponent(); | |
| 26 | 新增: } | |
| 27 | 新增: } | |
| 28 | 新增:} | |

