ソースを参照

添加项目文件。

Jiangsheng 1 ヶ月 前
コミット
91c275594c

+ 25 - 0
SKMC.UI.sln

@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.36227.6
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SKMC.UI", "SKMC.UI\SKMC.UI.csproj", "{51942C87-F99A-4DA2-AF63-9617CFFFCF2B}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{51942C87-F99A-4DA2-AF63-9617CFFFCF2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{51942C87-F99A-4DA2-AF63-9617CFFFCF2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{51942C87-F99A-4DA2-AF63-9617CFFFCF2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{51942C87-F99A-4DA2-AF63-9617CFFFCF2B}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {9B9C84FB-D635-4BAE-ADA1-92F81D35F7F4}
+	EndGlobalSection
+EndGlobal

+ 93 - 0
SKMC.UI/Assets/Brushes.xaml

@@ -0,0 +1,93 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <ResourceDictionary.MergedDictionaries>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Themes/Dark.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Assets/Colors.xaml"/>
+    </ResourceDictionary.MergedDictionaries>
+    <SolidColorBrush x:Key="Brush.Background" Color="{StaticResource Color.Background}" />
+    <SolidColorBrush x:Key="Brush.DarkBackground" Color="{StaticResource Color.DarkBackground}" />
+    <SolidColorBrush x:Key="Brush.MachineControls" Color="{StaticResource Color.MachineControls}" />
+    <SolidColorBrush x:Key="Brush.Overlay2Percent" Opacity="0.02" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay3Percent" Opacity="0.03" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay5Percent" Opacity="0.05" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay6Percent" Opacity="0.06" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay7Percent" Opacity="0.07" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay8Percent" Opacity="0.08" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay12Percent" Opacity="0.12" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay17Percent" Opacity="0.17" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay24Percent" Opacity="0.24" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.Overlay48Percent" Opacity="0.48" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.DarkOverlay12Percent" Opacity="0.12" Color="{StaticResource Color.DarkOverlay}" />
+    <SolidColorBrush x:Key="Brush.DarkOverlay80Percent" Opacity="0.8" Color="{StaticResource Color.DarkOverlay}" />
+    <SolidColorBrush x:Key="Brush.DarkOverlay50Percent" Opacity="0.5" Color="{StaticResource Color.DarkOverlay}" />
+    <SolidColorBrush x:Key="Brush.Button" Color="{StaticResource Color.Button}" />
+    <SolidColorBrush x:Key="Brush.ButtonPressed" Opacity="0.08" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.ButtonTextInactive" Opacity="0.38" Color="{StaticResource Color.Text}" />
+    <SolidColorBrush x:Key="Brush.ButtonTextDisabled" Opacity="0.30" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.ButtonHover" Opacity="0.2" Color="{DynamicResource Color.Signature}" />
+    <SolidColorBrush x:Key="Brush.PrimaryButton" Color="{DynamicResource Color.Signature}" />
+    <SolidColorBrush x:Key="Brush.PrimaryButtonMouseOver" Opacity="0.24" Color="{DynamicResource Color.Signature}" />
+    <SolidColorBrush x:Key="Brush.PrimaryButtonPressed" Color="{DynamicResource Color.SignatureDark}" />
+    <SolidColorBrush x:Key="Brush.PrimaryButtonDisabled" Opacity="0.03" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.SecondaryButton" Opacity="0.12" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.SecondaryButtonMouseOver" Opacity="0.24" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.SecondaryButtonPressed" Opacity="0.08" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.SecondaryButtonDisabled" Opacity="0.03" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.TertiaryButton" Color="Transparent" />
+    <SolidColorBrush x:Key="Brush.TertiaryButtonMouseOver" Opacity="0.24" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.TertiaryButtonPressed" Opacity="0.08" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.TertiaryButtonDisabled" Color="Transparent" />
+    <SolidColorBrush x:Key="Brush.TertiaryButtonBorder" Opacity="0.48" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.TertiaryButtonPressedBorder" Opacity="0.16" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.TertiaryButtonDisabledBorder" Opacity="0.03" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.SelectedBorder" Color="{StaticResource Color.SelectedBorder}" />
+    <SolidColorBrush x:Key="Brush.NotSelectedBorder" Color="{StaticResource Color.Border}" />
+    <SolidColorBrush x:Key="Brush.SelectionDisabledBackground" Color="{StaticResource Color.SelectionDisabledBackground}" />
+    <SolidColorBrush x:Key="Brush.SelectionInactiveBorder" Opacity="0.38" Color="{StaticResource Color.Overlay}" />
+    <SolidColorBrush x:Key="Brush.SelectionSelected" Color="{DynamicResource Color.Signature}" />
+    <SolidColorBrush x:Key="Brush.SelectionSelectedBackground" Color="{DynamicResource Color.SignatureLight}" />
+    <SolidColorBrush x:Key="Brush.Text" Color="{StaticResource Color.Text}" />
+    <SolidColorBrush x:Key="Brush.TextContrast" Color="{StaticResource Color.TextContrast}" />
+    <SolidColorBrush x:Key="Brush.TextInactive" Color="{StaticResource Color.TextInactive}" />
+    <SolidColorBrush x:Key="Brush.Label" Color="{StaticResource Color.Label}" />
+    <SolidColorBrush x:Key="Brush.SecondaryFont" Opacity="0.6" Color="{StaticResource Color.Text}" />
+    <SolidColorBrush x:Key="Brush.Annotation" Color="DarkViolet" />
+    <SolidColorBrush x:Key="Brush.TextSecondColor" Color="Yellow" />
+    <SolidColorBrush x:Key="Brush.Icon" Color="{StaticResource Color.Icon}" />
+    <SolidColorBrush x:Key="Brush.IconInactive" Color="{StaticResource Color.IconInactive}" />
+    <SolidColorBrush x:Key="Brush.Border" Color="{StaticResource Color.Border}" />
+    <SolidColorBrush x:Key="Brush.DashboardBackground" Color="{StaticResource Color.DashboardBackground}" />
+    <SolidColorBrush x:Key="Brush.RgbRed" Color="{StaticResource Color.Error}" />
+    <SolidColorBrush x:Key="Brush.RgbGreen" Color="{StaticResource Color.RgbGreen}" />
+    <SolidColorBrush x:Key="Brush.RgbBlue" Color="{StaticResource Color.RgbBlue}" />
+    <SolidColorBrush x:Key="Brush.Neutral" Color="{StaticResource Color.Neutral}" />
+    <SolidColorBrush x:Key="Brush.Error" Color="{StaticResource Color.Error}" />
+    <SolidColorBrush x:Key="Brush.ErrorLowOpacity" Opacity="0.1" Color="{StaticResource Color.Error}" />
+    <SolidColorBrush x:Key="Brush.Warning" Color="{StaticResource Color.Warning}" />
+    <SolidColorBrush x:Key="Brush.WarningLowOpacity" Opacity="0.1" Color="{StaticResource Color.Warning}" />
+    <SolidColorBrush x:Key="Brush.Good" Color="{StaticResource Color.Good}" />
+    <SolidColorBrush x:Key="Brush.GoodLowOpacity" Opacity="0.1" Color="{StaticResource Color.Good}" />
+    <SolidColorBrush x:Key="Brush.DebugLog" Color="{StaticResource Color.DebugLog}" />
+    <SolidColorBrush x:Key="Brush.Start" Color="{StaticResource Color.Start}" />
+    <SolidColorBrush x:Key="Brush.Stop" Color="{StaticResource Color.Stop}" />
+    <SolidColorBrush x:Key="Brush.Pause" Color="{StaticResource Color.Pause}" />
+    <SolidColorBrush x:Key="Brush.HomePosition" Color="{StaticResource Color.HomePosition}" />
+    <SolidColorBrush x:Key="Brush.LockDoors" Color="{StaticResource Color.LockDoors}" />
+    <SolidColorBrush x:Key="Brush.Ellipse" Color="LimeGreen" />
+    <SolidColorBrush x:Key="Brush.StripeFirstEdge" Color="LimeGreen" />
+    <SolidColorBrush x:Key="Brush.StripeSecondFirstEdge" Color="LimeGreen" />
+    <SolidColorBrush x:Key="Brush.StripeMiddleLine" Color="Red" />
+    <SolidColorBrush x:Key="Brush.Contour" Color="Blue" />
+    <SolidColorBrush x:Key="Brush.SecondContour" Color="Orange" />
+    <SolidColorBrush x:Key="Brush.CrossMarker" Color="Blue" />
+    <SolidColorBrush x:Key="Brush.ChartLine.0" Color="Violet" />
+    <SolidColorBrush x:Key="Brush.ChartLine.1" Color="White" />
+    <SolidColorBrush x:Key="Brush.ChartLine.2" Color="LimeGreen" />
+    <SolidColorBrush x:Key="Brush.ChartLine.3" Color="Yellow" />
+    <SolidColorBrush x:Key="Brush.ChartLine.4" Color="Red" />
+    <SolidColorBrush x:Key="Brush.ChartLine.5" Color="LightBlue" />
+    <SolidColorBrush x:Key="Brush.ChartLine.6" Color="Orange" />
+    <SolidColorBrush x:Key="Brush.ChartLine.7" Color="Pink" />
+    <SolidColorBrush x:Key="Brush.ChartLine.8" Color="LightGray" />
+    <SolidColorBrush x:Key="Brush.ChartLine.9" Color="LightYellow" />
+</ResourceDictionary>

+ 37 - 0
SKMC.UI/Assets/Colors.xaml

@@ -0,0 +1,37 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Color x:Key="Color.Neutral">#545454</Color>
+    <Color x:Key="Color.Error">#FF191C</Color>
+    <Color x:Key="Color.Warning">#FCB000</Color>
+    <Color x:Key="Color.Good">#00F976</Color>
+    <Color x:Key="Color.RgbGreen">#00FF00</Color>
+    <Color x:Key="Color.DebugLog">#5ADAE2</Color>
+    <Color x:Key="Color.Blue">#0000FF</Color>
+    <Color x:Key="Color.DrawCross">Green</Color>
+    <Color x:Key="Color.Ruler">Red</Color>
+    <Color x:Key="Color.ZoomWindow">Yellow</Color>
+    <Color x:Key="Color.Start">#009647</Color>
+    <Color x:Key="Color.Stop">#CD1315</Color>
+    <Color x:Key="Color.Pause">#FCB000</Color>
+    <Color x:Key="Color.HomePosition">#0091FF</Color>
+    <Color x:Key="Color.LockDoors">#FCB000</Color>
+    <Color x:Key="Color.RgbBlue">#363BFF</Color>
+    <Color x:Key="Color.ViewPort.Element">Green</Color>
+    <Color x:Key="Color.ViewPort.SecondaryElement">LightGreen</Color>
+    <Color x:Key="Color.ViewPort.SelectedElement">Blue</Color>
+    <Color x:Key="Color.ViewPort.NotValid">Red</Color>
+    <Color x:Key="Color.ViewPort.Origin">Cyan</Color>
+    <Color x:Key="Color.ViewPort.ScanFieldOutline">LightBlue</Color>
+    <Color x:Key="Color.ViewPort.SelectedContour">LightBlue</Color>
+    <Color x:Key="Color.ViewPort.MaterialOutline">Gray</Color>
+    <Color x:Key="Color.ViewPort.LaneOutline">Olive</Color>
+    <Color x:Key="Color.ViewPort.Scanfield">White</Color>
+    <Color x:Key="Color.ViewPort.OriginMarker">Green</Color>
+    <Color x:Key="Color.ViewPort.Padding">Orange</Color>
+    <Color x:Key="Color.ViewPort.HardwareLimitOutline">LightGray</Color>
+    <Color x:Key="Color.ViewPort.Grid">#50A0A0A0</Color>
+    <Color x:Key="Color.ViewPort.Layer0">Black</Color>
+    <Color x:Key="Color.ViewPort.Layer1">Green</Color>
+    <Color x:Key="Color.ViewPort.Layer2">Orange</Color>
+    <Color x:Key="Color.ViewPort.Layer3">Fuchsia</Color>
+</ResourceDictionary>

+ 10 - 0
SKMC.UI/Assets/Font.xaml

@@ -0,0 +1,10 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
+                    xmlns:system="clr-namespace:System;assembly=mscorlib">
+    <FontFamily x:Key="FontFamily.Global">Arial</FontFamily>
+    <system:Double x:Key="FontSize.Headline">21</system:Double>
+    <system:Double x:Key="FontSize.Callout">18</system:Double>
+    <system:Double x:Key="FontSize.Title">16</system:Double>
+    <system:Double x:Key="FontSize.Body">14</system:Double>
+    <system:Double x:Key="FontSize.Label">12</system:Double>
+</ResourceDictionary>

ファイルの差分が大きいため隠しています
+ 139 - 0
SKMC.UI/Assets/Icons.xaml


+ 34 - 0
SKMC.UI/Assets/Storyboards.xaml

@@ -0,0 +1,34 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+                    xmlns:sys="clr-namespace:System;assembly=mscorlib">
+    
+    <!--<Storyboard x:Key="Storyboard.Blinking">
+        <DoubleAnimationUsingKeyFrames AutoReverse="True" RepeatBehavior="Forever" TargetProperty="Opacity" Duration="0:0:1">
+            <DoubleAnimationUsingKeyFrames.KeyFrames>
+                <DiscreteDoubleKeyFrame KeyTime="0:0:0.0" Value="0.0" />
+                <DiscreteDoubleKeyFrame KeyTime="0:0:0.5" Value="1.0" />
+                <DiscreteDoubleKeyFrame KeyTime="0:0:1.0" Value="0.0" />
+            </DoubleAnimationUsingKeyFrames.KeyFrames>
+        </DoubleAnimationUsingKeyFrames>
+    </Storyboard>
+    <Storyboard x:Key="Storyboard.BackgroundBlinking">
+        <ObjectAnimationUsingKeyFrames RepeatBehavior="Forever" TargetProperty="Background" Duration="0:0:2">
+            <ObjectAnimationUsingKeyFrames.KeyFrames>
+                <DiscreteObjectKeyFrame KeyTime="0:0:1">
+                    <DiscreteObjectKeyFrame.Value>
+                        <SolidColorBrush Opacity="0.0" />
+                    </DiscreteObjectKeyFrame.Value>
+                </DiscreteObjectKeyFrame>
+            </ObjectAnimationUsingKeyFrames.KeyFrames>
+        </ObjectAnimationUsingKeyFrames>
+    </Storyboard>-->
+    
+    <Storyboard x:Key="Storyboard.Runtime">
+        <ObjectAnimationUsingKeyFrames Duration="0:0:2"
+                                       Storyboard.TargetProperty="DataContext" 
+                                       RepeatBehavior="Forever">
+            <DiscreteObjectKeyFrame Value="{x:Static sys:DateTime.Now}" KeyTime="0:0:0"/>
+            <DiscreteObjectKeyFrame Value="{x:Static sys:DateTime.Now}" KeyTime="0:0:1"/>
+        </ObjectAnimationUsingKeyFrames>
+    </Storyboard>
+</ResourceDictionary>

+ 14 - 0
SKMC.UI/CustomControls/SKButton.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Controls;
+
+namespace SKMC.UI.CustomControls
+{
+    public class SKButton : Button
+    {
+
+    }
+}

+ 14 - 0
SKMC.UI/CustomControls/SKCheckBox.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Controls;
+
+namespace SKMC.UI.CustomControls
+{
+    public class SKCheckBox : CheckBox
+    {
+
+    }
+}

+ 95 - 0
SKMC.UI/CustomControls/SKRadioButton.cs

@@ -0,0 +1,95 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+
+namespace SKMC.UI.CustomControls
+{
+    public class SKRadioButton : RadioButton
+    {
+        static SKRadioButton()
+        {
+            DefaultStyleKeyProperty.OverrideMetadata(typeof(SKRadioButton), new FrameworkPropertyMetadata(typeof(SKRadioButton)));
+        }
+        public object AdditionalTag
+        {
+            get { return (object)GetValue(AdditionalTagProperty); }
+            set { SetValue(AdditionalTagProperty, value); }
+        }
+        // 附加标签,接受任意类型对象。
+        public static readonly DependencyProperty AdditionalTagProperty =
+            DependencyProperty.Register("AdditionalTag", typeof(object), typeof(SKRadioButton), new PropertyMetadata(null));
+
+        public Geometry Icon
+        {
+            get { return (Geometry)GetValue(IconProperty); }
+            set { SetValue(IconProperty, value); }
+        }
+        // 按钮图标
+        public static readonly DependencyProperty IconProperty =
+            DependencyProperty.Register("Icon", typeof(Geometry), typeof(SKRadioButton), new PropertyMetadata(null));
+        /// <summary>
+        /// Icon填充颜色
+        /// </summary>
+        public SolidColorBrush IconFillColor
+        {
+            get { return (SolidColorBrush)GetValue(IconFillColorProperty); }
+            set { SetValue(IconFillColorProperty, value); }
+        }
+
+        public static readonly DependencyProperty IconFillColorProperty =
+            DependencyProperty.Register("IconFillColor", typeof(SolidColorBrush), typeof(SKRadioButton), new PropertyMetadata(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0))));
+        /// <summary>
+        /// Icon描边颜色
+        /// </summary>
+        public SolidColorBrush IconStrokeColor
+        {
+            get { return (SolidColorBrush)GetValue(IconStrokeColorProperty); }
+            set { SetValue(IconStrokeColorProperty, value); }
+        }
+
+        public static readonly DependencyProperty IconStrokeColorProperty =
+            DependencyProperty.Register("IconStrokeColor", typeof(SolidColorBrush), typeof(SKRadioButton), new PropertyMetadata(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0))));
+        public double IconWidth
+        {
+            get { return (double)GetValue(IconWidthProperty); }
+            set { SetValue(IconWidthProperty, value); }
+        }
+
+        public static readonly DependencyProperty IconWidthProperty =
+            DependencyProperty.Register("IconWidth", typeof(double), typeof(SKRadioButton), new PropertyMetadata(20.0));
+
+        public double IconHeight
+        {
+            get { return (double)GetValue(IconHeightProperty); }
+            set { SetValue(IconHeightProperty, value); }
+        }
+
+        public static readonly DependencyProperty IconHeightProperty =
+            DependencyProperty.Register("IconHeight", typeof(double), typeof(SKRadioButton), new PropertyMetadata(20.0));
+
+
+        public double IconStrokeThickness
+        {
+            get { return (double)GetValue(IconStrokeThicknessProperty); }
+            set { SetValue(IconStrokeThicknessProperty, value); }
+        }
+
+        public static readonly DependencyProperty IconStrokeThicknessProperty =
+            DependencyProperty.Register("IconStrokeThickness", typeof(double), typeof(SKRadioButton), new PropertyMetadata(1.0));
+
+
+        public CornerRadius CornerRadius
+        {
+            get { return (CornerRadius)GetValue(CornerRadiusProperty); }
+            set { SetValue(CornerRadiusProperty, value); }
+        }
+
+        public static readonly DependencyProperty CornerRadiusProperty =
+            DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(SKRadioButton), new PropertyMetadata(new CornerRadius(0, 0, 0, 0)));
+    }
+}

+ 16 - 0
SKMC.UI/FrameWork.xaml

@@ -0,0 +1,16 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <ResourceDictionary.MergedDictionaries>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Themes/Dark.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Assets/Colors.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Assets/Brushes.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Assets/Font.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Assets/Icons.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Assets/Storyboards.xaml"/>
+        <!--Styles-->
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Styles/Button.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Styles/RadioButton.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Styles/ScrollViewer.xaml"/>
+        <!--Styles-->
+    </ResourceDictionary.MergedDictionaries>
+</ResourceDictionary>

+ 55 - 0
SKMC.UI/Properties/AssemblyInfo.cs

@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("SKMC.UI")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("SKMC.UI")]
+[assembly: AssemblyCopyright("Copyright ©  2026")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+//若要开始生成可本地化的应用程序,请设置
+//.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture>
+//例如,如果您在源文件中使用的是美国英语,
+//使用的是美国英语,请将 <UICulture> 设置为 en-US。  然后取消
+//对以下 NeutralResourceLanguage 特性的注释。  更新
+//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly:ThemeInfo(
+    ResourceDictionaryLocation.None, //主题特定资源词典所处位置
+                             //(未在页面中找到资源时使用,
+                             //或应用程序资源字典中找到时使用)
+    ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
+                                      //(未在页面中找到资源时使用,
+                                      //、应用程序或任何主题专用资源字典中找到时使用)
+)]
+
+
+// 程序集的版本信息由下列四个值组成: 
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 62 - 0
SKMC.UI/Properties/Resources.Designer.cs

@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     此代码由工具生成。
+//     运行时版本: 4.0.30319.42000
+//
+//     对此文件的更改可能导致不正确的行为,如果
+//     重新生成代码,则所做更改将丢失。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace SKMC.UI.Properties {
+    
+    
+    /// <summary>
+    ///   强类型资源类,用于查找本地化字符串等。
+    /// </summary>
+    // 此类是由 StronglyTypedResourceBuilder
+    // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+    // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+    // (以 /str 作为命令选项),或重新生成 VS 项目。
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   返回此类使用的缓存 ResourceManager 实例。
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if ((resourceMan == null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SKMC.UI.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   重写当前线程的 CurrentUICulture 属性,对
+        ///   使用此强类型资源类的所有资源查找执行重写。
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}

+ 117 - 0
SKMC.UI/Properties/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 30 - 0
SKMC.UI/Properties/Settings.Designer.cs

@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace SKMC.UI.Properties
+{
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}

+ 7 - 0
SKMC.UI/Properties/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 127 - 0
SKMC.UI/SKMC.UI.csproj

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{51942C87-F99A-4DA2-AF63-9617CFFFCF2B}</ProjectGuid>
+    <OutputType>library</OutputType>
+    <RootNamespace>SKMC.UI</RootNamespace>
+    <AssemblyName>SKMC.UI</AssemblyName>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <WarningLevel>4</WarningLevel>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xaml">
+      <RequiredTargetFramework>4.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="WindowsBase" />
+    <Reference Include="PresentationCore" />
+    <Reference Include="PresentationFramework" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CustomControls\SKButton.cs" />
+    <Compile Include="CustomControls\SKCheckBox.cs" />
+    <Compile Include="CustomControls\SKRadioButton.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Resource Include="Assets\Brushes.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Resource>
+    <Resource Include="Assets\Colors.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Resource>
+    <Resource Include="Assets\Font.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Resource>
+    <Resource Include="Assets\Icons.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Resource>
+    <Resource Include="FrameWork.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+      <DesignTime>True</DesignTime>
+    </Resource>
+    <Resource Include="Themes\Dark.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Resource>
+    <Resource Include="Themes\Light.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Resource>
+  </ItemGroup>
+  <ItemGroup>
+    <Page Include="Assets\Storyboards.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Styles\Button.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Styles\RadioButton.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Styles\ScrollViewer.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>

+ 70 - 0
SKMC.UI/Styles/Button.xaml

@@ -0,0 +1,70 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <!--基础按钮-->
+    <Style x:Key="Button.Base" TargetType="{x:Type Button}">
+        <Setter Property="HorizontalContentAlignment" Value="Center"/>
+        <Setter Property="VerticalContentAlignment" Value="Center"/>
+        <Setter Property="Width" Value="100"/>
+        <Setter Property="Height" Value="40"/>
+        <Setter Property="BorderThickness" Value="0"/>
+        <Setter Property="Foreground" Value="{DynamicResource Brush.Text}"/>
+        <Setter Property="FontSize" Value="{DynamicResource FontSize.Body}"/>
+        <Setter Property="Cursor" Value="Hand"/>
+    </Style>
+    <!--主要按钮-->
+    <Style x:Key="Button.Primary" TargetType="{x:Type Button}" BasedOn="{StaticResource Button.Base}">
+        <Setter Property="Background" Value="{DynamicResource Brush.PrimaryButton}"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type Button}">
+                    <Border Background="{TemplateBinding Background}"
+                            BorderThickness="{TemplateBinding BorderThickness}"
+                            BorderBrush="{TemplateBinding BorderBrush}">
+                        <ContentPresenter Content="{TemplateBinding Content}"
+                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
+                    </Border>
+                    <ControlTemplate.Triggers>
+                        <Trigger Property="IsMouseOver" Value="True">
+                            <Setter Property="Background" Value="{DynamicResource Brush.PrimaryButtonPressed}"/>
+                        </Trigger>
+                        <Trigger Property="IsPressed" Value="True">
+                            <Setter Property="Background" Value="{DynamicResource Brush.PrimaryButtonMouseOver}"/>
+                        </Trigger>
+                        <Trigger Property="IsEnabled" Value="False">
+                            <Setter Property="Background" Value="{DynamicResource Brush.PrimaryButtonDisabled}"/>
+                            <Setter Property="Foreground" Value="{DynamicResource Brush.TextInactive}"/>
+                        </Trigger>
+                    </ControlTemplate.Triggers>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+    <Style x:Key="Button.Secondary" TargetType="{x:Type Button}" BasedOn="{StaticResource Button.Base}">
+        <Setter Property="Background" Value="{DynamicResource Brush.Neutral}"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type Button}">
+                    <Border Background="{TemplateBinding Background}"
+                            BorderThickness="{TemplateBinding BorderThickness}"
+                            BorderBrush="{TemplateBinding BorderBrush}">
+                        <ContentPresenter Content="{TemplateBinding Content}"
+                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
+                    </Border>
+                    <ControlTemplate.Triggers>
+                        <Trigger Property="IsMouseOver" Value="True">
+                            <Setter Property="Background" Value="{DynamicResource Brush.Border}"/>
+                        </Trigger>
+                        <Trigger Property="IsPressed" Value="True">
+                            <Setter Property="Background" Value="{DynamicResource Brush.Neutral}"/>
+                        </Trigger>
+                        <Trigger Property="IsEnabled" Value="False">
+                            <Setter Property="Opacity" Value="0.6"/>
+                        </Trigger>
+                    </ControlTemplate.Triggers>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+</ResourceDictionary>

+ 107 - 0
SKMC.UI/Styles/RadioButton.xaml

@@ -0,0 +1,107 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+                    xmlns:c="clr-namespace:SKMC.UI.CustomControls">
+
+    <Style x:Key="RadioButton.SystemMenu" TargetType="{x:Type c:SKRadioButton}">
+        <Setter Property="Background" Value="{DynamicResource Brush.Background}"/>
+        <Setter Property="Foreground" Value="{DynamicResource Brush.Text}"/>
+        <Setter Property="Cursor" Value="Hand"/>
+        <Setter Property="FontWeight" Value="Normal"/>
+        <Setter Property="FontSize" Value="20"/>
+        <Setter Property="Height" Value="40"/>
+        <Setter Property="IconWidth" Value="24"/>
+        <Setter Property="IconHeight" Value="24"/>
+        <Setter Property="IconFillColor" Value="Transparent"/>
+        <Setter Property="IconStrokeColor" Value="{DynamicResource Brush.Icon}"/>
+        <Setter Property="IconStrokeThickness" Value="1"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type c:SKRadioButton}">
+                    <Border x:Name="menuButton"  
+                        Background="{TemplateBinding Background}" 
+                        BorderThickness="{TemplateBinding BorderThickness}"
+                        CornerRadius="{TemplateBinding CornerRadius}">
+                        <Grid>
+                            <Grid.ColumnDefinitions>
+                                <ColumnDefinition Width="45"/>
+                                <ColumnDefinition/>
+                            </Grid.ColumnDefinitions>
+                            <!-- Selected  -->
+                            <Border x:Name="btnSelected" Grid.ColumnSpan="2"  CornerRadius="4" Width="210" HorizontalAlignment="Right"/>
+                            <!-- Indicator -->
+                            <Rectangle Name="Indicator" HorizontalAlignment="Left" 
+                                   Width="5" Height="50" VerticalAlignment="Stretch" 
+                                   RadiusX="2" RadiusY="2"
+                                   Margin="5 0 0 0"/>
+                            <!-- Icon -->
+                            <Path x:Name="Icon" Data="{Binding Icon, RelativeSource={RelativeSource AncestorType={x:Type c:SKRadioButton}}}" 
+                                  Height="{TemplateBinding IconHeight}" 
+                                  Width="{TemplateBinding IconWidth}" 
+                                  Stretch="Uniform" 
+                                  Stroke="{TemplateBinding IconStrokeColor}"
+                                  Fill="{TemplateBinding IconFillColor}"
+                                  StrokeThickness="{TemplateBinding IconStrokeThickness}"
+                                  VerticalAlignment="Center" 
+                                  HorizontalAlignment="Right" 
+                                  Margin="0 0 3 0"/>
+                            <!-- Text -->
+                            <TextBlock x:Name="txtName" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5 0 0 0"
+                                        Grid.Column="1" Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}"
+                                        FontWeight="{TemplateBinding FontWeight}"
+                                        FontSize="{TemplateBinding FontSize}"/>
+                        </Grid>
+                    </Border>
+                    <ControlTemplate.Triggers>
+                        <Trigger Property="IsMouseOver" Value="True">
+                            <Setter TargetName="txtName" Property="Foreground" Value="{DynamicResource Brush.TextSecondColor}"/>
+                            <Setter TargetName="Icon" Property="Fill" Value="{DynamicResource Brush.ButtonHover}"/>
+                            <Setter TargetName="Icon" Property="Stroke" Value="{DynamicResource Brush.ButtonHover}"/>
+                            <!-- Optional 
+                        <Setter TargetName="Indicator" Property="Fill" Value="red"/>
+                        <Setter TargetName="Indicator" Property="Height" Value="20"/>-->
+                        </Trigger>
+                        <Trigger Property="IsChecked" Value="True">
+                            <Setter TargetName="Icon" Property="Fill" Value="{DynamicResource Brush.SelectionSelected}"/>
+                            <Setter TargetName="Icon" Property="Stroke" Value="{DynamicResource Brush.SelectionSelected}"/>
+                            <Setter TargetName="Indicator" Property="Fill" Value="{DynamicResource Brush.Overlay3Percent}"/>
+                            <Setter TargetName="Indicator" Property="Height" Value="20"/>
+                            <Setter TargetName="btnSelected" Property="Background" Value="{DynamicResource Brush.SelectionSelected}"/>
+                            <Setter TargetName="txtName" Property="Foreground" Value="{DynamicResource Brush.SelectionSelected}"/>
+                        </Trigger>
+                    </ControlTemplate.Triggers>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+    <Style x:Key="RadioButton.Base" TargetType="{x:Type RadioButton}">
+        <Setter Property="BorderBrush" Value="{DynamicResource Brush.SelectedBorder}" />
+        <Setter Property="Foreground" Value="{DynamicResource Brush.Text}" />
+        <Setter Property="Height" Value="32" />
+        <Setter Property="SnapsToDevicePixels" Value="True" />
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type RadioButton}">
+                    <BulletDecorator Background="#00FFFFFF">
+                        <BulletDecorator.Bullet>
+                            <Border Name="Border" Width="32" Height="32" BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="2" CornerRadius="16">
+                                <Ellipse Name="Ellipse" Width="18" Height="18" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="{DynamicResource Brush.SelectionSelected}" Visibility="Hidden" />
+                            </Border>
+                        </BulletDecorator.Bullet>
+                        <ContentPresenter Margin="16,0,0,0" VerticalAlignment="Center" />
+                    </BulletDecorator>
+                    <ControlTemplate.Triggers>
+                        <Trigger Property="IsEnabled" Value="False">
+                            <Setter Value="{DynamicResource Brush.Overlay3Percent}" Property="BorderBrush" />
+                        </Trigger>
+                        <Trigger Property="IsChecked" Value="True">
+                            <Setter Value="{DynamicResource Brush.SelectionSelected}" Property="BorderBrush" />
+                            <Setter TargetName="Ellipse" Property="Visibility" Value="Visible" />
+                        </Trigger>
+                    </ControlTemplate.Triggers>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+        <Setter Property="ToolTip" Value="{Binding Content, RelativeSource={RelativeSource Self}}" />
+    </Style>
+    <Style x:Key="{x:Type RadioButton}" BasedOn="{StaticResource RadioButton.Base}" TargetType="{x:Type RadioButton}" />
+</ResourceDictionary>

+ 225 - 0
SKMC.UI/Styles/ScrollViewer.xaml

@@ -0,0 +1,225 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <ResourceDictionary.MergedDictionaries>
+        <ResourceDictionary Source="pack://application:,,,/SKMC.UI;component/Assets/Brushes.xaml"/>
+    </ResourceDictionary.MergedDictionaries>
+    <!--滚动条两头的按钮-->
+    <Style x:Key="ScrollBarButton" TargetType="{x:Type RepeatButton}">
+        <Setter Property="Background" Value="Transparent"></Setter>
+        <Setter Property="Foreground" Value="Gray"></Setter>
+        <Setter Property="VerticalAlignment" Value="Center"></Setter>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type RepeatButton}">
+                    <Border>
+                        <Path x:Name="btnIcon" Data="{TemplateBinding Content}" 
+                              Fill="{TemplateBinding Foreground}" 
+                              Width="25" Height="15" Stretch="Uniform"/>
+                    </Border>
+                    <ControlTemplate.Triggers>
+                        <Trigger Property="IsMouseOver" Value="True">
+                            <Setter Property="Fill" Value="Red" TargetName="btnIcon"></Setter>
+                        </Trigger>
+                        <Trigger Property="IsEnabled" Value="False">
+                            <Setter Property="Opacity" Value="0.5" TargetName="btnIcon"/>
+                        </Trigger>
+                    </ControlTemplate.Triggers>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+    <!--滚动条滑块两边按钮样式-->
+    <Style x:Key="ScrollBarTrackButton" TargetType="{x:Type RepeatButton}">
+        <Setter Property="Background" Value="#CCCCCC"></Setter>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type RepeatButton}">
+                    <Border Background="{TemplateBinding Background}"></Border>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+    <!--滚动条滑块样式-->
+    <ControlTemplate x:Key="ThumbTemplate" TargetType="Thumb">
+        <Border  x:Name="sliderBar" CornerRadius="3" 
+                     Margin="2" SnapsToDevicePixels="True" 
+                     Background="#505050"/>
+        <ControlTemplate.Triggers>
+            <Trigger Property="IsMouseOver" Value="True">
+                <Setter Property="Background" Value="#8E8E93" TargetName="sliderBar"></Setter>
+            </Trigger>
+            <Trigger Property="IsMouseOver" Value="False">
+                <Setter Property="Background" Value="#505050" TargetName="sliderBar"></Setter>
+            </Trigger>
+            <Trigger Property="IsEnabled" Value="False">
+                <Setter Property="Opacity" Value="0.5" TargetName="sliderBar"></Setter>
+            </Trigger>
+        </ControlTemplate.Triggers>
+    </ControlTemplate>
+    <!--水平滚滚动条模板-->
+    <ControlTemplate x:Key="HorizontalScrollBar" TargetType="{x:Type ScrollBar}">
+        <Grid x:Name="HorizontalRoot" Height="{TemplateBinding Height}">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto" />
+                <ColumnDefinition Width="*" />
+                <ColumnDefinition Width="Auto" />
+            </Grid.ColumnDefinitions>
+            <!--内部背景-->
+            <Border x:Name="BgInner" Grid.Column="1" SnapsToDevicePixels="True" CornerRadius="6"
+                    Background="#CCCCCC"/>
+            <!--左按钮-->
+            <Border Grid.Column="0">
+                <RepeatButton  x:Name="HorizontalSmallDecrease" 
+                               Content="{DynamicResource Icon.ArrowLeftRight}"  
+                               Style="{StaticResource ScrollBarButton}" 
+                               IsTabStop="False" Interval="50" 
+                               Width="15" Height="15"
+                               Margin="0,1,0,0" Command="ScrollBar.LineLeftCommand"/>
+            </Border>
+            <!--中间滑动区域-->
+            <Track x:Name="PART_Track" IsDirectionReversed="False" Grid.Column="1">
+                <!--左滑块-->
+                <Track.DecreaseRepeatButton>
+                    <RepeatButton x:Name="HorizontalLargeDecrease" Command="ScrollBar.PageLeftCommand"
+                                      IsTabStop="False" Interval="50" Style="{StaticResource ScrollBarTrackButton}" />
+                </Track.DecreaseRepeatButton>
+                <!--中间滑块 Margin="1" VerticalAlignment="Center" VerticalContentAlignment="Center" -->
+                <Track.Thumb>
+                    <Thumb Template="{StaticResource ThumbTemplate}" />
+                </Track.Thumb>
+                <!--右滑块-->
+                <Track.IncreaseRepeatButton>
+                    <RepeatButton x:Name="HorizontalLargeIncrease" Command="ScrollBar.PageRightCommand"
+                                      IsTabStop="False"  Interval="50" Style="{StaticResource ScrollBarTrackButton}" />
+                </Track.IncreaseRepeatButton>
+            </Track>
+            <!--右按钮-->
+            <Border Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center"
+                    Background="#AAAAAA">
+                <RepeatButton Content="{DynamicResource Icon.ArrowRight}"  
+                              Style="{StaticResource ScrollBarButton}"
+                              IsTabStop="False" Interval="50"
+                              Command="ScrollBar.LineRightCommand"/>
+            </Border>
+        </Grid>
+        <ControlTemplate.Triggers>
+            <Trigger Property="IsMouseOver" Value="true">
+                <Setter TargetName="BgInner" Property="Opacity" Value="0.5"/>
+            </Trigger>
+        </ControlTemplate.Triggers>
+    </ControlTemplate>
+    <!--垂直滚滚动条模板-->
+    <ControlTemplate x:Key="VerticalScrollBar" TargetType="{x:Type ScrollBar}">
+        <Grid x:Name="VerticalRoot" Height="{TemplateBinding Height}">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="Auto" />
+                <RowDefinition Height="*" />
+                <RowDefinition Height="Auto" />
+            </Grid.RowDefinitions>
+            <!--内部背景-->
+            <Border x:Name="BgInner" Grid.Row="1" Margin="0" CornerRadius="6" SnapsToDevicePixels ="True"
+                    Background="#CCCCCC"/>
+            <!--上按钮-->
+            <Border Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center" x:Name="VerticalSmallDecrease">
+                <RepeatButton Content="{DynamicResource arrowUp}"  
+                              Style="{StaticResource ScrollBarButton}"
+                              IsTabStop="False" Interval="50" Margin="0" 
+                              Command="ScrollBar.LineUpCommand"/>
+            </Border>
+            <!--中间滑动区域-->
+            <Track x:Name="PART_Track" IsDirectionReversed="true" Grid.Row="1">
+                <!--上滑块-->
+                <Track.DecreaseRepeatButton>
+                    <RepeatButton x:Name="HorizontalLargeDecrease" 
+                                  Command="ScrollBar.PageUpCommand"
+                                  IsTabStop="False" Interval="50" 
+                                  Style="{StaticResource ScrollBarTrackButton}" />
+                </Track.DecreaseRepeatButton>
+                <!--中间滑块-->
+                <Track.Thumb>
+                    <Thumb Template="{StaticResource ThumbTemplate}" MinHeight="10"/>
+                </Track.Thumb>
+                <!--下滑块-->
+                <Track.IncreaseRepeatButton>
+                    <RepeatButton x:Name="HorizontalLargeIncrease" Command="ScrollBar.PageDownCommand"
+                                      IsTabStop="False" Interval="50" Style="{StaticResource ScrollBarTrackButton}" />
+                </Track.IncreaseRepeatButton>
+            </Track>
+            <!--下按钮-->
+            <Border Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" x:Name="VerticalSmallIncrease">
+                <RepeatButton Content="{DynamicResource arrowDown}" 
+                              Style="{StaticResource ScrollBarButton}"
+                              IsTabStop="False" Interval="50" Margin="0" 
+                              Command="ScrollBar.LineDownCommand"/>
+            </Border>
+        </Grid>
+        <ControlTemplate.Triggers>
+            <Trigger Property="IsMouseOver" Value="true">
+                <Setter TargetName="BgInner" Property="Opacity" Value="0.5"/>
+            </Trigger>
+        </ControlTemplate.Triggers>
+    </ControlTemplate>
+    <!--ScrollBar样式-->
+    <Style x:Key="DefaultScrollBar" TargetType="{x:Type ScrollBar}">
+        <Setter Property="SnapsToDevicePixels" Value="True" />
+        <Setter Property="OverridesDefaultStyle" Value="true" />
+        <Style.Triggers>
+            <Trigger Property="Orientation" Value="Horizontal">
+                <Setter Property="Template" Value="{StaticResource HorizontalScrollBar}" />
+                <Setter Property="Height" Value="12" />
+            </Trigger>
+            <Trigger Property="Orientation" Value="Vertical">
+                <Setter Property="Template" Value="{StaticResource VerticalScrollBar}" />
+                <Setter Property="Width" Value="12" />
+            </Trigger>
+        </Style.Triggers>
+    </Style>
+    <!--ScrollViewer样式-->
+    <Style x:Key="ScrollViewer.Default" TargetType="{x:Type ScrollViewer}">
+        <Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
+        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type ScrollViewer}">
+                    <Grid x:Name="Grid" Background="{TemplateBinding Background}">
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="*" x:Name="leftColumn" />
+                            <ColumnDefinition Width="Auto" x:Name="rightColumn" />
+                        </Grid.ColumnDefinitions>
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="*" />
+                            <RowDefinition Height="Auto" />
+                        </Grid.RowDefinitions>
+                        <ScrollContentPresenter x:Name="PART_ContentHost" CanContentScroll="{TemplateBinding CanContentScroll}"
+                                                CanHorizontallyScroll="False" CanVerticallyScroll="False" 
+                                                ContentTemplate="{TemplateBinding ContentTemplate}"
+                                                Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"
+                                                Grid.Row="0" Grid.Column="0" />
+                        <!--<ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}"
+                                                CanHorizontallyScroll="False" CanVerticallyScroll="False" 
+                                                ContentTemplate="{TemplateBinding ContentTemplate}"
+                                                Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"
+                                                Grid.Row="0" Grid.Column="0" />-->
+                        <!--垂直滚动条 -->
+                        <ScrollBar x:Name="PART_VerticalScrollBar" AutomationProperties.AutomationId="VerticalScrollBar"
+                                   ViewportSize="{TemplateBinding ViewportHeight}"
+                                   Cursor="Arrow" Grid.Column="1" Maximum="{TemplateBinding ScrollableHeight}"
+                                   Minimum="0" Grid.Row="0" 
+                                   Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
+                                   Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
+                                   Style="{DynamicResource DefaultScrollBar}"/>
+                        <!--水平底部滚动条-->
+                        <ScrollBar x:Name="PART_HorizontalScrollBar" 
+                                   AutomationProperties.AutomationId="HorizontalScrollBar"
+                                   Cursor="Arrow" Grid.Column="0" Maximum="{TemplateBinding ScrollableWidth}"
+                                   Minimum="0" Orientation="Horizontal" Grid.Row="1"
+                                   Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
+                                   Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
+                                   ViewportSize="{TemplateBinding ViewportWidth}" 
+                                   Style="{DynamicResource DefaultScrollBar}"/>
+                    </Grid>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+</ResourceDictionary>

+ 31 - 0
SKMC.UI/Themes/Dark.xaml

@@ -0,0 +1,31 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Color x:Key="Color.Background">#1E1E1E</Color>
+    <Color x:Key="Color.DarkBackground">#161616</Color>
+    <Color x:Key="Color.MachineControls">#121212</Color>
+    <Color x:Key="Color.Overlay">#FFFFFF</Color>
+    <Color x:Key="Color.DarkOverlay">#000000</Color>
+    <Color x:Key="Color.HeaderAlternative">#2D2D2D</Color>
+    <Color x:Key="Color.Button">#FFFFFF</Color>
+    <Color x:Key="Color.Text">#FFFFFF</Color>
+    <Color x:Key="Color.TextContrast">#292929</Color>
+    <Color x:Key="Color.TextInactive">#9C9C9C</Color>
+    <Color x:Key="Color.PreviewBackGround">#444</Color>
+    <Color x:Key="Color.Label">#848484</Color>
+    <Color x:Key="Color.Icon">#FFFFFF</Color>
+    <Color x:Key="Color.IconInactive">#9C9C9C</Color>
+    <Color x:Key="Color.Border">#808080</Color>
+    <Color x:Key="Color.DashboardBackground">#3a3a3a</Color>
+    <Color x:Key="Color.SelectedBorder">#FFFFFF</Color>
+    <Color x:Key="Color.SelectionDisabledBackground">#333333</Color>
+
+    <Color x:Key="Color.Signature">#00929D</Color>
+    <Color x:Key="Color.SignatureLight">#CCEAEC</Color>
+    <Color x:Key="Color.SignatureDark">#006D75</Color>
+    <Color x:Key="Color.SignatureAccent">#00929D</Color>
+    <SolidColorBrush x:Key="Brush.Signature" Color="{DynamicResource Color.Signature}" />
+    <SolidColorBrush x:Key="Brush.SignatureLight" Color="{DynamicResource Color.SignatureLight}" />
+    <SolidColorBrush x:Key="Brush.SignatureDark" Color="{DynamicResource Color.SignatureDark}" />
+    <SolidColorBrush x:Key="Brush.SignatureAccent" Color="{DynamicResource Color.SignatureAccent}" />
+
+</ResourceDictionary>

+ 27 - 0
SKMC.UI/Themes/Light.xaml

@@ -0,0 +1,27 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <!-- 浅色主题颜色定义 -->
+    <Color x:Key="Color.Background">#F5F5F5</Color>
+    <Color x:Key="Color.DarkBackground">#E8E8E8</Color>
+    <Color x:Key="Color.MachineControls">#DCDCDC</Color>
+    <Color x:Key="Color.Overlay">#000000</Color>
+    <Color x:Key="Color.DarkOverlay">#FFFFFF</Color>
+    <Color x:Key="Color.HeaderAlternative">#D2D2D2</Color>
+    <Color x:Key="Color.Button">#333333</Color>
+    <Color x:Key="Color.Text">#1A1A1A</Color>
+    <Color x:Key="Color.TextContrast">#F5F5F5</Color>
+    <Color x:Key="Color.TextInactive">#666666</Color>
+    <Color x:Key="Color.PreviewBackGround">#CCCCCC</Color>
+    <Color x:Key="Color.Label">#7A7A7A</Color>
+    <Color x:Key="Color.Icon">#1A1A1A</Color>
+    <Color x:Key="Color.IconInactive">#666666</Color>
+    <Color x:Key="Color.Border">#A0A0A0</Color>
+    <Color x:Key="Color.DashboardBackground">#C8C8C8</Color>
+    <Color x:Key="Color.SelectedBorder">#1A1A1A</Color>
+    <Color x:Key="Color.SelectionDisabledBackground">#CCCCCC</Color>
+
+    <Color x:Key="Color.Signature">#00929D</Color>
+    <Color x:Key="Color.SignatureLight">#CCEAEC</Color>
+    <Color x:Key="Color.SignatureDark">#006D75</Color>
+    <Color x:Key="Color.SignatureAccent">#00929D</Color>
+</ResourceDictionary>

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません