样式demo

This commit is contained in:
GG Z
2025-12-28 11:47:54 +08:00
parent ceccab9abb
commit 1fd8d2ced7
65 changed files with 2369 additions and 799 deletions

View File

@@ -1,28 +1,26 @@
<neu:NeoWindow
<n:NeoWindow
x:Class="NeoUITest.ControlTestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dataModel="clr-namespace:NeoUITest.DataModel"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:neu="https://github.com/ShrlAlgo/NeoUI"
xmlns:sys="clr-namespace:System;assembly=netfx.force.conflicts"
xmlns:n="https://github.com/ShrlAlgo/NeoUI"
Title="测试"
Width="800"
Height="600"
d:Height="1200"
d:SizeToContent="WidthAndHeight"
d:DesignHeight="1200"
Icon="/Resources/Images/ImageTest.png"
mc:Ignorable="d">
<!-- 主窗口背景色,这是拟态风格的基础 -->
<neu:NeoWindow.Resources>
<n:NeoWindow.Resources>
<dataModel:DataGridDemo x:Key="Dgd" />
<!--<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/NeuWPFTest;component/ButtonStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>-->
</neu:NeoWindow.Resources>
</n:NeoWindow.Resources>
<!--<lu:WindowAssist.TitleBar>
<Menu>
<MenuItem Header="Help">
@@ -31,61 +29,82 @@
</Menu>
</lu:WindowAssist.TitleBar>-->
<Grid>
<neu:StackPanel Background="{DynamicResource BackgroundLayoutBrush}" Spacing="10">
<neu:PropertyField
Grid.Row="0"
Margin="6,0"
PropertyName="属性"
PropertyValue="123" />
<neu:PropertyField
Grid.Row="1"
Margin="6,0"
PropertyName="属性x"
PropertyValue="154" />
<UniformGrid
Grid.Row="6"
Margin="20"
HorizontalAlignment="Center">
<Button
Content="Button"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Left" />
<Button
Content="Button"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Top" />
<Button
Content="Button"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Right" />
<Button
Content="Button"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.InitialShowDelay="0"
ToolTipService.Placement="Bottom" />
<TextBox Style="{StaticResource SlotTextBoxStyle}" Text="TextBox" />
</UniformGrid>
<neu:NeuDataGrid
x:Name="NeuDG1"
Margin="4"
BindableSelectedItems="{Binding SelectedDataGridItems, Mode=TwoWay}"
DataContext="{StaticResource Dgd}"
ItemsSource="{Binding DataCollection}" />
<DataGrid
Margin="4"
DataContext="{StaticResource Dgd}"
ItemsSource="{Binding DataCollection}" />
<DataGrid
x:Name="DataGridCheckBox"
Margin="4"
DataContext="{StaticResource Dgd}"
ItemsSource="{Binding DataCollection}"
Style="{StaticResource CheckBoxHeadDataGridStyle}" />
<ScrollViewer VerticalScrollBarVisibility="Auto">
<n:StackPanel Background="{DynamicResource BackgroundLayoutBrush}" Spacing="10">
<n:PropertyField
Margin="6,0"
PropertyName="属性"
PropertyValue="123" />
<n:PropertyField
Margin="6,0"
PropertyName="属性x"
PropertyValue="154" />
<UniformGrid Rows="1">
<Button
Content="Button"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Top" />
<Button
Content="Button"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Right" />
<Button
Content="Button"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.InitialShowDelay="0"
ToolTipService.Placement="Bottom" />
<TextBox Style="{StaticResource SlotTextBoxStyle}" Text="TextBox" />
</UniformGrid>
<n:NeuDataGrid
x:Name="NeuDG1"
Margin="4"
BindableSelectedItems="{Binding SelectedDataGridItems, Mode=TwoWay}"
DataContext="{StaticResource Dgd}"
ItemsSource="{Binding DataCollection}" />
<DataGrid
Margin="4"
DataContext="{StaticResource Dgd}"
ItemsSource="{Binding DataCollection}" />
<DataGrid
x:Name="DataGridCheckBox"
Margin="4"
DataContext="{StaticResource Dgd}"
ItemsSource="{Binding DataCollection}"
Style="{StaticResource CheckBoxHeadDataGridStyle}" />
<UniformGrid Rows="4">
<TextBox x:Name="License" />
<Button
Click="LicenseClick"
Content="授权算号"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Left" />
<TextBox x:Name="PrivateKey" n:InputAssist.Prefix="私钥:" />
<TextBox x:Name="PublicKey" n:InputAssist.Prefix="公钥:" />
<Button
Click="GenerateKeyClick"
Content="计算公私密钥"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Left" />
<Button
Click="ValidateClick"
Content="验证"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Left" />
<Button
Click="RemoveLicenseClick"
Content="移除注册"
Style="{StaticResource EmbossButtonStyle}"
ToolTip="测试"
ToolTipService.Placement="Left" />
</neu:StackPanel>
</UniformGrid>
</n:StackPanel>
</ScrollViewer>
</Grid>
</neu:NeoWindow>
</n:NeoWindow>

View File

@@ -1,5 +1,14 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Management;
using System.Net;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Windows;
using Microsoft.Win32;
namespace NeoUITest
{
@@ -8,9 +17,215 @@ namespace NeoUITest
/// </summary>
public partial class ControlTestWindow
{
private const string Privatekey =
@"<RSAKeyValue><Modulus>rd5+EjU6QxaTY/AalU9g6ugAquN0ahJSgeahnf2CrfvUAWFNJ+SH7Qr0RcvOTyAbWfvLWoBDACKaPsg+8nRQcO3EZdFyjJ9oycLNrw38+gSB2+/79Axys/8MHtSXVUw9WN2e9LxeHOQGtcaoSsp+bPGaXswthovQ2CkvBTmCokcAOX6UaR7Av4npaXyEoGCUsZLEiSydMsNbQ+wLsumVg1H2o/cpkO0s4DiJHoF66zUuxA+pYSjSCn5KTUsOemf+gBsob6Sw+7WOToyiOkMdO9Op6esf8yL7DJ1Yd40XaKd5IeLQmEX/b+n1EV2JEkGO0p9q9MQRp6NrEc9LvfMJWQ==</Modulus><Exponent>AQAB</Exponent><P>yR+R5ofKJenqgMvXxT/Tqxka4jeuPz+Uta9WXYVyzIeyjESOEe1B9uM+DkhM27zw8XsG143KpzUp8jy5Gh6z14ivfUbv09GN5ICFWeqEOQJ8JSPfqcq5YKpFNY+zJGNgUfKdLwMUvu55O6Y2BdB2yLFwAUztUAW0qT+ZmINI3xM=</P><Q>3U84e83rhoi5o4kR9I4JllM1ys/43uvJSVDwkqAo+p7R1uFUsl1STNHVo/d0mJKXLOf8J4fI0yVz1H73XBHjEzJqJPWlycOArA+c8eKtLvvIlauSh1ulAJbSKlINxjr6aVjXH9ztGKRVIRU2EuUPKQKwnxScKrqNbeGqRKHPx2M=</Q><DP>ktj9I3AkFfisIywyuC+5MeUbru5uyHl48As8qP4l6tZtdGMdxFMSZdxX0//QNmTHG9nzDfHWdK2pmdfiYwLl1spTL8pak7Mewidgtl03+5Qn5spBpWyCW+UWsVvhtgDlNBBL2iaKwDnIxNe//BDQmgqMODbd0x7HYQgx8pxw2Yc=</DP><DQ>dblkhIcfmKs2hQWvJXZBJ1QQM1i6PGsU4glKT9Uet2KwoSuwUElQNEkS6mwB+/9Op7an7adPbvJnUUxQ7QsezeFtkUeS72cuFVkg1ZMNKQcKxoNEKPjZJx0ToyuO5DoPZua5WNu+y/LuzfBomVh73gbuSVE/WYNvJFp8ppGk450=</DQ><InverseQ>gSHzvMS0Fu4j/yuzjOjLXYxR8qP3AweEbLlM8/SBjpT5qq+R+j/m3q7vTvYZwwMqAMamGWmTHAlQvOjnSeV2Qnb2C/bqs5jTTiDGyY/xqGV8pFlkegieBl+zJYrOyisUP/xNk4ckKhGfGUIan91N8R5M9Dk2x0hOTCY7m4Tv2SI=</InverseQ><D>polHLj+Hh7z2/jF79OnsRfRkt0pYNkVIfB4hTYgGBIoCfjPpyD0wKM9mO/hDqyxwplb0Z8IU6us53MrG6EqaxiAoDvJ4CtOhdie+BV+boQpyK+0I4rCNqXSw8lLkhRIabKUSXQ6UAo4zEyeuCL0+LTGZkBV3wbjoGDQSUqnMQ4uzvuGsWUU76Y/nnpYf6VVajCsLAseQbdAbeLuL0WPmNqO+E3SLsL72z5lgqkk5yyEQYDTWZMEuFUsyGmP+XC4EBp44IW3eQmPPBfUqxRvCAq2Gvk95Q+9H9FZlTW4ctMSezOZaH9pAaJvG5QL2ggw+KXh+pljnM8bYtL2I+KWtNQ==</D></RSAKeyValue>";
public ControlTestWindow()
{
InitializeComponent();
}
private void LicenseClick(object sender, RoutedEventArgs e)
{
var license = CreateLicense(LicenseEngine.GetMachineCode(), "20251230", Privatekey);
LicenseEngine.SaveToRegistry("Key", license);
License.Text=license;
MessageBox.Show("授权码已写入注册表");
}
// 开发者工具中的生成逻辑
public string CreateLicense(string machineCode, string expiryDate, string privateKey)
{
string dataToSign = $"{machineCode}|{expiryDate}";
using var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKey);
var formatter = new RSAPKCS1SignatureFormatter(rsa);
formatter.SetHashAlgorithm("SHA256");
byte[] dataBytes = Encoding.UTF8.GetBytes(dataToSign);
using var sha = SHA256.Create();
byte[] hash = sha.ComputeHash(dataBytes);
string signature = Convert.ToBase64String(formatter.CreateSignature(hash));
// 最终格式:签名|机器码|到期日期
return $"{signature}|{machineCode}|{expiryDate}";
}
private void GenerateKeyClick(object sender, RoutedEventArgs e)
{
using var rsa = new RSACryptoServiceProvider(2048);
PublicKey.Text = rsa.ToXmlString(false); // 放在插件里
PrivateKey.Text = rsa.ToXmlString(true); // 自己妥善保存
}
private void ValidateClick(object sender, RoutedEventArgs e)
{
var result = LicenseEngine.Validate();
MessageBox.Show(result.message);
}
private void RemoveLicenseClick(object sender, RoutedEventArgs e)
{
LicenseEngine.DestroyAllLicenseData();
MessageBox.Show("授权已注销");
}
}
public class LicenseEngine
{
// 【重要】替换为你生成的公钥
private const string PublicKey = @"<RSAKeyValue><Modulus>rd5+EjU6QxaTY/AalU9g6ugAquN0ahJSgeahnf2CrfvUAWFNJ+SH7Qr0RcvOTyAbWfvLWoBDACKaPsg+8nRQcO3EZdFyjJ9oycLNrw38+gSB2+/79Axys/8MHtSXVUw9WN2e9LxeHOQGtcaoSsp+bPGaXswthovQ2CkvBTmCokcAOX6UaR7Av4npaXyEoGCUsZLEiSydMsNbQ+wLsumVg1H2o/cpkO0s4DiJHoF66zUuxA+pYSjSCn5KTUsOemf+gBsob6Sw+7WOToyiOkMdO9Op6esf8yL7DJ1Yd40XaKd5IeLQmEX/b+n1EV2JEkGO0p9q9MQRp6NrEc9LvfMJWQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
private static string RegPath = @$"Software\{Assembly.GetExecutingAssembly().GetName()}\License";
/// <summary>
/// 完整验证逻辑
/// </summary>
public static (bool isValid, string message) Validate()
{
string licenseKey = LoadFromRegistry("Key");
if (string.IsNullOrEmpty(licenseKey)) return (false, "未找到授权码");
try
{
// 1. RSA 解密/验证逻辑
// 激活码格式:签名(Base64)|机器码|到期日期
var parts = licenseKey.Split('|');
if (parts.Length != 3) return (false, "授权格式非法");
string signature = parts[0];
string mCode = parts[1];
string expiryStr = parts[2];
// 2. 验证是否是本机的机器码
if (mCode != GetMachineCode()) return (false, "授权码与本机硬件不匹配");
// 3. 验证 RSA 签名(确保数据没被篡改)
if (!VerifySignature($"{mCode}|{expiryStr}", signature)) return (false, "授权签名校验失败");
// 4. 时间校验
DateTime expiryDate = DateTime.ParseExact(expiryStr, "yyyyMMdd", CultureInfo.InvariantCulture);
DateTime now = GetRobustDateTime();
// 防回滚检查
DateTime lastRun = GetLastRunTime();
if (now < lastRun) return (false, "系统时间异常,请检查时钟");
UpdateLastRunTime(now);
if (now > expiryDate) return (false, $"授权已于 {expiryDate:yyyy-MM-dd} 到期");
return (true, "授权有效");
}
catch { return (false, "解析授权出错"); }
}
private static bool VerifySignature(string data, string signature)
{
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(PublicKey);
var formatter = new RSAPKCS1SignatureDeformatter(rsa);
formatter.SetHashAlgorithm("SHA256");
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
using (var sha = SHA256.Create())
{
byte[] hash = sha.ComputeHash(dataBytes);
return formatter.VerifySignature(hash, Convert.FromBase64String(signature));
}
}
}
public static string GetMachineCode()
{
// 组合 CPU ID + 硬盘 ID
string raw = GetHardwareId("Win32_Processor", "ProcessorId") +
GetHardwareId("Win32_PhysicalMedia", "SerialNumber");
using (var sha = SHA256.Create())
{
byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(raw));
return BitConverter.ToString(hash).Replace("-", "").Substring(0, 16);
}
}
private static string GetHardwareId(string wmiClass, string property)
{
try
{
using (var mc = new ManagementClass(wmiClass))
foreach (var mo in mc.GetInstances()) return mo[property]?.ToString().Trim();
}
catch { }
return "UNKNOWN";
}
// 获取可靠的时间(网络优先,本地其次)
private static DateTime GetRobustDateTime()
{
try
{
var request = WebRequest.Create("http://www.baidu.com");
request.Timeout = 2000;
using (var response = request.GetResponse())
{
string dateStr = response.Headers["Date"];
return DateTime.ParseExact(dateStr, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
}
}
catch { return DateTime.Now; }
}
#region
private static DateTime GetLastRunTime()
{
string val = LoadFromRegistry("T");
return string.IsNullOrEmpty(val) ? DateTime.MinValue : new DateTime(long.Parse(val));
}
private static void UpdateLastRunTime(DateTime now) => SaveToRegistry("T", now.Ticks.ToString());
public static void SaveToRegistry(string key, string val)
{
using var r = Registry.CurrentUser.CreateSubKey(RegPath);
r.SetValue(key, val);
}
private static string LoadFromRegistry(string key)
{
using var r = Registry.CurrentUser.OpenSubKey(RegPath);
return r?.GetValue(key)?.ToString();
}
/// <summary>
/// 仅移除当前的激活码(重置授权状态,但保留时间戳防止白嫖)
/// </summary>
public static void ClearLicenseKey()
{
try
{
using (var r = Registry.CurrentUser.OpenSubKey(RegPath, true))
{
if (r != null && r.GetValue("Key") != null)
{
r.DeleteValue("Key");
}
}
}
catch (Exception ex)
{
Console.WriteLine("移除授权码失败: " + ex.Message);
}
}
/// <summary>
/// 彻底销毁所有授权痕迹(包括时间戳记录,通常用于卸载)
/// </summary>
public static void DestroyAllLicenseData()
{
try
{
// 第二个参数为 false 表示:如果路径不存在,不抛出异常
Registry.CurrentUser.DeleteSubKeyTree(RegPath, false);
}
catch (Exception ex)
{
Console.WriteLine("彻底清理注册表失败: " + ex.Message);
}
}
#endregion
}
}

View File

@@ -138,57 +138,17 @@
</ComboBox>
</ToolBar>
<ToolBar Foreground="{DynamicResource PrimaryFocusedBrush}" Header="工具栏">
<ToggleButton Content="切换" />
<Button
x:Name="Test"
Click="Test_OnClick"
Content="测试" />
Content="测试窗口" />
<Button Click="Icon_OnClick" Content="图标" />
<Button Click="ColorPalette_OnClick" Content="配色" />
<Button Click="ShowNeumorphism_Click" Content="Neumorphism" />
</ToolBar>
</ToolBarTray>
<!-- 中间部分 -->
<n:Anchor Grid.Row="1" Margin="4">
<n:StackPanel Spacing="5">
<GroupBox n:ControlAssist.AnchorHeaderText="装饰器 Decoration" Header="装饰器">
<StackPanel>
<n:FlexibleRowPanel>
<n:SlotBorder
Height="100"
Margin="5"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Content="凹槽"
CornerRadius="16"
FontSize="24"
Foreground="{DynamicResource PrimaryGradientBrush}" />
<n:EmbossBorder
Margin="5"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Content="浮雕"
ContextMenu="{StaticResource ContextMenuDemo}"
CornerRadius="16"
FontSize="24"
Foreground="{DynamicResource PrimaryGradientBrush}"
ToolTip="右键" />
<n:Card
Margin="5"
Content="卡片"
CornerRadius="16"
FontSize="24"
Foreground="{DynamicResource PrimaryGradientBrush}" />
</n:FlexibleRowPanel>
<n:LightedSurface
Height="100"
Margin="5"
Content="在此处移动鼠标"
CornerRadius="16"
FontSize="24"
Foreground="{DynamicResource PrimaryGradientBrush}" />
</StackPanel>
</GroupBox>
<StackPanel n:ControlAssist.AnchorHeaderText="警告提示 Alert">
<StackPanel>
<CheckBox x:Name="IsBanner" Content="标题" />
@@ -337,10 +297,6 @@
</n:FlexibleRowPanel>
<n:FlexibleRowPanel>
<n:Tag Content="默认标签" />
<n:Tag
Closable="True"
Content="可关闭标签"
Style="{StaticResource EmbossTag}" />
<n:Tag
Closable="True"
Content="颜色标签"
@@ -381,7 +337,7 @@
ColumnSpacing="0"
Columns="6"
RowSpacing="0"
Rows="4">
Rows="2">
<Button n:ControlAssist.Icon="{n:Icon SymbolValue=SmartButton}" Content="基本" />
<Button
n:ControlAssist.Icon="{n:Icon SymbolValue=SmartButton}"
@@ -678,42 +634,6 @@
<n:ToggleSwitch IsChecked="True" IsEnabled="False" />
</n:FlexibleRowPanel>
<n:FlexibleRowPanel>
<n:ToggleSwitch IsChecked="False" Style="{StaticResource FloatToggleSwitchStyle}" />
<n:ToggleSwitch
IsChecked="False"
IsEnabled="False"
Style="{StaticResource FloatToggleSwitchStyle}" />
<n:ToggleSwitch IsChecked="True" Style="{StaticResource FloatToggleSwitchStyle}" />
<n:ToggleSwitch
IsChecked="True"
IsEnabled="False"
Style="{StaticResource FloatToggleSwitchStyle}" />
</n:FlexibleRowPanel>
<n:FlexibleRowPanel>
<n:ToggleSwitch
n:ControlAssist.OffContent="{n:Icon SymbolValue=ToggleOff}"
n:ControlAssist.OnContent="{n:Icon ToggleOn}"
n:ControlAssist.ShowText="True"
IsChecked="True"
Style="{StaticResource SlotToggleSwitch}" />
<n:ToggleSwitch
n:ControlAssist.OffContent="{n:Icon SymbolValue=ToggleOff}"
n:ControlAssist.OnContent="{n:Icon ToggleOn}"
IsChecked="True"
IsEnabled="False"
Style="{StaticResource SlotToggleSwitch}" />
<n:ToggleSwitch
n:ControlAssist.ShowText="False"
IsChecked="False"
Style="{StaticResource SlotToggleSwitch}" />
<n:ToggleSwitch
IsChecked="False"
IsEnabled="False"
Style="{StaticResource SlotToggleSwitch}" />
</n:FlexibleRowPanel>
</StackPanel>
<StackPanel n:ControlAssist.AnchorHeaderText="文本标签 Label">
<UniformGrid Rows="1">
@@ -743,39 +663,7 @@
IsChecked="True"
IsEnabled="False" />
</UniformGrid>
<UniformGrid Rows="1">
<CheckBox Content="复选框" Style="{StaticResource SlotCheckBoxStyle}" />
<CheckBox
Content="复选框"
IsEnabled="False"
Style="{StaticResource SlotCheckBoxStyle}" />
<CheckBox
Content="复选框"
IsChecked="True"
Style="{StaticResource SlotCheckBoxStyle}" />
<CheckBox
Content="复选框"
IsChecked="True"
IsEnabled="False"
Style="{StaticResource SlotCheckBoxStyle}" />
</UniformGrid>
</StackPanel>
<UniformGrid Rows="1">
<CheckBox Content="复选框" Style="{StaticResource EmbossCheckBoxStyle}" />
<CheckBox
Content="复选框"
IsEnabled="False"
Style="{StaticResource EmbossCheckBoxStyle}" />
<CheckBox
Content="复选框"
IsChecked="True"
Style="{StaticResource EmbossCheckBoxStyle}" />
<CheckBox
Content="复选框"
IsChecked="True"
IsEnabled="False"
Style="{StaticResource EmbossCheckBoxStyle}" />
</UniformGrid>
<StackPanel n:ControlAssist.AnchorHeaderText="单选框 RadioButton">
<n:FlexibleRowPanel>
<RadioButton
@@ -803,28 +691,6 @@
GroupName="RadioG2"
IsEnabled="False" />
</n:FlexibleRowPanel>
<n:FlexibleRowPanel>
<RadioButton
Content="单选按钮 A"
GroupName="RadioG3"
IsChecked="True"
Style="{StaticResource EmbossRadioButtonStyle}" />
<RadioButton
Content="单选按钮 C"
GroupName="RadioG3"
Style="{StaticResource EmbossRadioButtonStyle}" />
<RadioButton
Content="禁用单选按钮 A"
GroupName="RadioG4"
IsChecked="True"
IsEnabled="False"
Style="{StaticResource EmbossRadioButtonStyle}" />
<RadioButton
Content="禁用单选按钮 C"
GroupName="RadioG4"
IsEnabled="False"
Style="{StaticResource EmbossRadioButtonStyle}" />
</n:FlexibleRowPanel>
</StackPanel>
<StackPanel n:ControlAssist.AnchorHeaderText="滑动/滚动条 Slider">
<Grid>
@@ -921,8 +787,8 @@
</StackPanel>
<StackPanel n:ControlAssist.AnchorHeaderText="文件、文件夹 Browser">
<n:FlexibleRowPanel>
<n:ChooseBox PlaceholderText="请选择路径" />
<n:ChooseBox IsEnabled="False" Text="选择路径" />
<n:ChooseBox />
<n:ChooseBox IsEnabled="False" />
</n:FlexibleRowPanel>
<UniformGrid Rows="1">
<n:UploadArea
@@ -951,7 +817,6 @@
<n:FlexibleRowPanel n:ControlAssist.AnchorHeaderText="时间日期 DataPicker" LayoutMode="Auto">
<StackPanel>
<DatePicker />
<DatePicker Style="{StaticResource SlotDatePicker}" />
</StackPanel>
<Calendar Margin="5">
<Calendar.BlackoutDates>
@@ -1053,7 +918,7 @@
</n:FlexibleRowPanel>
<n:FlexibleRowPanel LayoutMode="Auto" Spacing="20">
<UniformGrid Columns="1">
<UniformGrid Columns="3">
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
@@ -1063,87 +928,14 @@
<ListBoxItem Content="Away" />
<ListBoxItem Content="Night" />
</ListBox>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:BehaviorAssist.EnableSlideAnimation="True"
SelectedIndex="1"
Style="{StaticResource SlideTabGroupListBoxStyle}">
<!-- 这里是你的数据项 -->
<sys:String>Tab 1</sys:String>
<sys:String>Tab 2</sys:String>
<sys:String>Tab 3</sys:String>
<sys:String>Another Tab</sys:String>
</ListBox>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:BehaviorAssist.EnableSlideAnimation="True"
IsEnabled="False"
SelectedIndex="1"
Style="{StaticResource SlideTabGroupListBoxStyle}">
<!-- 这里是你的数据项 -->
<sys:String>Tab 1</sys:String>
<sys:String>Tab 2</sys:String>
<sys:String>Tab 3</sys:String>
<sys:String>Another Tab</sys:String>
</ListBox>
</UniformGrid>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:ControlAssist.Orientation="Vertical"
SelectedIndex="1"
SelectionMode="Multiple"
Style="{StaticResource SlotTabGroupListBoxStyle}">
<ListBoxItem Content="Home" />
<ListBoxItem Content="Away" />
<ListBoxItem Content="Night" />
</ListBox>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:ControlAssist.Orientation="Vertical"
IsEnabled="False"
SelectedIndex="1"
Style="{StaticResource SlotTabGroupListBoxStyle}">
<ListBoxItem Content="Home" />
<ListBoxItem Content="Away" />
<ListBoxItem Content="Night" />
</ListBox>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:BehaviorAssist.EnableSlideAnimation="True"
n:ControlAssist.Orientation="Vertical"
SelectedIndex="0"
SelectionMode="Multiple"
Style="{StaticResource SlideTabGroupListBoxStyle}">
<!-- 这里是你的数据项 -->
<sys:String>Tab 1</sys:String>
<sys:String>Tab 2</sys:String>
<sys:String>Tab 3</sys:String>
<sys:String>Another Tab</sys:String>
</ListBox>
</n:FlexibleRowPanel>
</StackPanel>
<StackPanel n:ControlAssist.AnchorHeaderText="数据展示 TabControl">
<WrapPanel>
<TabControl Style="{StaticResource NavigationTabControlStyle}">
<TabItem Header="选项卡 1">
<Grid Margin="4">
<!-- <Separator /> -->
<DataGrid
Margin="4"
DataContext="{StaticResource Dgd}"
ItemsSource="{Binding DataCollection}"
SelectedItem="{Binding SelectedDataGridItem}" />
</Grid>
</TabItem>
<TabItem Header="选项卡 2" />
<TabItem Header="禁用选项卡" IsEnabled="False" />
</TabControl>
<TabControl>
<TabItem Header="选项卡 1">

View File

@@ -403,6 +403,15 @@ public partial class MainWindow
#endregion
private void ShowNeumorphism_Click(object sender, RoutedEventArgs e)
{
NeumorphismWindow window = new NeumorphismWindow
{
Owner = this,
WindowStartupLocation = WindowStartupLocation.CenterOwner
};
window.ShowDialog();
}
}
#region

View File

@@ -25,10 +25,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135"/>
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NeoUI\NeoUI.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Management" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,519 @@
<n:NeoWindow
x:Class="NeoUITest.NeumorphismWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dataModel="clr-namespace:NeoUITest.DataModel"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:n="https://github.com/ShrlAlgo/NeoUI"
xmlns:neoUiTest="clr-namespace:NeoUITest"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="NeumorphismWindow"
Width="800"
Height="450"
d:DataContext="{d:DesignInstance Type=neoUiTest:MainWindow}"
d:Height="Auto"
mc:Ignorable="d">
<n:NeoWindow.Resources>
<ResourceDictionary>
<ContextMenu x:Key="ContextMenuDemo">
<MenuItem Header="菜单01" />
<MenuItem Header="菜单02" />
<Separator />
<MenuItem Header="菜单03">
<MenuItem Header="菜单A1" />
<MenuItem Header="菜单A2" />
<Separator />
<MenuItem Header="菜单A3" />
</MenuItem>
</ContextMenu>
<neoUiTest:MainViewModel x:Key="MainViewModel" />
<!-- <ResourceDictionary.MergedDictionaries> -->
<!-- <enu:ThemesDictionary Theme="Dark" /> -->
<!-- <enu:ControlsDictionary /> -->
<!-- </ResourceDictionary.MergedDictionaries> -->
<dataModel:DataGridDemo x:Key="Dgd" />
</ResourceDictionary>
</n:NeoWindow.Resources>
<Grid>
<!--<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>-->
<n:Anchor>
<n:StackPanel Spacing="5">
<GroupBox n:ControlAssist.AnchorHeaderText="装饰器 Decoration" Header="Decoration">
<StackPanel>
<n:FlexibleRowPanel>
<n:SlotBorder
Height="100"
Margin="5"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Content="凹槽"
CornerRadius="16"
FontSize="24"
Foreground="{DynamicResource PrimaryGradientBrush}" />
<n:EmbossBorder
Margin="5"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Content="浮雕"
ContextMenu="{StaticResource ContextMenuDemo}"
CornerRadius="16"
FontSize="24"
Foreground="{DynamicResource PrimaryGradientBrush}"
ToolTip="右键" />
<n:Card
Margin="5"
Content="卡片"
CornerRadius="16"
FontSize="24"
Foreground="{DynamicResource PrimaryGradientBrush}" />
</n:FlexibleRowPanel>
<n:LightedSurface
Height="100"
Margin="5"
Content="在此处移动鼠标"
CornerRadius="16"
FontSize="24"
Foreground="{DynamicResource PrimaryGradientBrush}" />
</StackPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="按钮 Buttons" Header="Buttons">
<WrapPanel>
<Button
Margin="5"
Padding="10,5"
Content="浮雕按钮"
FontSize="16"
Style="{StaticResource EmbossButtonStyle}" />
<Button
Margin="5"
Padding="10,5"
FontSize="16"
Style="{StaticResource EmbossIconButtonStyle}" />
<Button
Margin="5"
Padding="10,5"
Content="浮动按钮"
FontSize="16"
Style="{StaticResource FloatButtonStyle}" />
<Button
Margin="5"
Padding="10,5"
Content="光亮按钮"
FontSize="16"
Style="{StaticResource LightedButtonStyle}" />
</WrapPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="文本框 TextBox" Header="TextBox">
<StackPanel>
<n:FlexibleRowPanel>
<TextBox Style="{StaticResource SlotTextBoxStyle}" />
<PasswordBox n:InputAssist.Password="453" Style="{StaticResource SlotPasswordBoxStyle}" />
<PasswordBox
n:InputAssist.Clearable="True"
n:InputAssist.IsPasswordVisible="True"
n:InputAssist.Password="453"
Style="{StaticResource SlotPasswordBoxStyle}" />
</n:FlexibleRowPanel>
<n:FlexibleRowPanel>
<DatePicker Style="{StaticResource SlotDatePicker}" />
<n:NumberBox Style="{StaticResource SlotNumberBoxStyle}" />
<n:NumericBox Style="{StaticResource SlotTextBoxStyle}" />
</n:FlexibleRowPanel>
<n:ChooseBox Style="{StaticResource SlotChooseBoxStyle}" />
</StackPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="Component" Header="Avatar Tag">
<n:FlexibleRowPanel>
<n:Avatar Style="{StaticResource SlotAvatarStyle}" />
<n:Tag Content="Tag" Style="{StaticResource EmbossTag}" />
<n:Chip Content="Chip" Style="{StaticResource EmbossChipStyle}" />
<n:Chip
Content="必应"
Style="{StaticResource EmbossChipStyle}"
Url="www.bing.com">
<n:Chip.Header>
<n:IconElement Symbol="Search" />
</n:Chip.Header>
</n:Chip>
</n:FlexibleRowPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="单选框 RadioButton" Header="RadioButton">
<n:FlexibleRowPanel>
<RadioButton
Margin="5"
Padding="10,5"
Content="浮雕单选框"
FontSize="16"
IsChecked="True"
Style="{StaticResource EmbossRadioButtonStyle}" />
<RadioButton
Margin="5"
Padding="10,5"
Content="浮雕单选框"
FontSize="16"
Style="{StaticResource EmbossRadioButtonStyle}" />
</n:FlexibleRowPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="切换 Toggle" Header="Toggle">
<StackPanel>
<n:FlexibleRowPanel>
<ToggleButton
Margin="5"
Padding="10,5"
Content="浮雕切换"
FontSize="16"
IsChecked="True"
Style="{StaticResource EmbossToggleButtonStyle}" />
<n:ToggleSwitch
Margin="5"
Padding="10,5"
Content="浮雕单选框"
FontSize="16"
Style="{StaticResource FloatToggleSwitchStyle}" />
</n:FlexibleRowPanel>
<n:FlexibleRowPanel>
<n:ToggleSwitch
n:ControlAssist.OffContent="{n:Icon SymbolValue=ToggleOff}"
n:ControlAssist.OnContent="{n:Icon ToggleOn}"
n:ControlAssist.ShowText="True"
IsChecked="True"
Style="{StaticResource SlotToggleSwitch}" />
<n:ToggleSwitch
n:ControlAssist.OffContent="{n:Icon SymbolValue=ToggleOff}"
n:ControlAssist.OnContent="{n:Icon ToggleOn}"
IsChecked="True"
IsEnabled="False"
Style="{StaticResource SlotToggleSwitch}" />
<n:ToggleSwitch
n:ControlAssist.ShowText="False"
IsChecked="False"
Style="{StaticResource SlotToggleSwitch}" />
<n:ToggleSwitch
IsChecked="False"
IsEnabled="False"
Style="{StaticResource SlotToggleSwitch}" />
</n:FlexibleRowPanel>
<n:FlexibleRowPanel>
<n:ToggleSwitch IsChecked="False" Style="{StaticResource FloatToggleSwitchStyle}" />
<n:ToggleSwitch
IsChecked="False"
IsEnabled="False"
Style="{StaticResource FloatToggleSwitchStyle}" />
<n:ToggleSwitch IsChecked="True" Style="{StaticResource FloatToggleSwitchStyle}" />
<n:ToggleSwitch
IsChecked="True"
IsEnabled="False"
Style="{StaticResource FloatToggleSwitchStyle}" />
</n:FlexibleRowPanel>
</StackPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="复选框 CheckBox" Header="CheckBox">
<StackPanel>
<n:FlexibleRowPanel>
<CheckBox
Margin="5"
Padding="10,5"
Content="浮雕单选框"
FontSize="16"
IsChecked="True"
Style="{StaticResource EmbossCheckBoxStyle}" />
<CheckBox
Margin="5"
Padding="10,5"
Content="浮雕单选框"
FontSize="16"
Style="{StaticResource EmbossCheckBoxStyle}" />
</n:FlexibleRowPanel>
<n:FlexibleRowPanel>
<CheckBox
Margin="5"
Padding="10,5"
Content="浮雕单选框"
FontSize="16"
IsChecked="True"
Style="{StaticResource SlotCheckBoxStyle}" />
<CheckBox
Margin="5"
Padding="10,5"
Content="浮雕单选框"
FontSize="16"
Style="{StaticResource SlotCheckBoxStyle}" />
</n:FlexibleRowPanel>
</StackPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="组合框 ComboBox" Header="ComboBox">
<n:FlexibleRowPanel>
<ComboBox
Margin="5"
Padding="10,5"
FontSize="16"
Style="{StaticResource FloatComboBoxStyle}" />
<n:Cascader
DisplayMemberPath="Name"
ItemsSource="{Binding StaffList, Mode=TwoWay}"
SelectedValue="{Binding SelectedItem, Mode=TwoWay}"
SubmenuMemberPath="Children" />
</n:FlexibleRowPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="分页导航 Pagination" Header="Pagination">
<n:FlexibleRowPanel>
<n:Pagination
Margin="0,15,0,0"
HorizontalAlignment="Center"
CurrentPage="3"
PageSize="20"
ShowPageInput="True"
Style="{StaticResource EmbossPaginationStyle}"
TotalItems="102" />
</n:FlexibleRowPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="标签导航 TabControl" Header="TabControl">
<n:FlexibleRowPanel>
<TabControl Style="{StaticResource NavigationTabControlStyle}">
<TabItem Header="选项卡 1">
<Grid Margin="4">
<!-- <Separator /> -->
<DataGrid
Margin="4"
DataContext="{StaticResource Dgd}"
ItemsSource="{Binding DataCollection}"
SelectedItem="{Binding SelectedDataGridItem}" />
</Grid>
</TabItem>
<TabItem Header="选项卡 2" />
<TabItem Header="禁用选项卡" IsEnabled="False" />
</TabControl>
</n:FlexibleRowPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="滑动/滚动条 Slider" Header="Slider Progress">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackPanel>
<CheckBox x:Name="IsSpining" Content="加载中" />
<StackPanel Height="100" Orientation="Horizontal">
<Slider
x:Name="ProgressVerticalSlider"
Maximum="100"
Minimum="0"
Orientation="Vertical"
Value="25" />
<Slider
x:Name="ProgressVerticalSlider1"
IsEnabled="False"
Maximum="100"
Minimum="0"
Orientation="Vertical"
Value="25" />
<ProgressBar
Height="100"
IsIndeterminate="{Binding ElementName=ProgressCheckbox, Path=IsChecked}"
Maximum="100"
Minimum="0"
Orientation="Vertical"
Style="{StaticResource SlotProgressBarStyle}"
Value="{Binding ElementName=ProgressVerticalSlider, Path=Value}" />
<ProgressBar
Height="100"
IsEnabled="False"
IsIndeterminate="{Binding ElementName=ProgressCheckbox, Path=IsChecked}"
Maximum="100"
Minimum="0"
Orientation="Vertical"
Style="{StaticResource SlotProgressBarStyle}"
Value="{Binding ElementName=ProgressVerticalSlider, Path=Value}" />
<ProgressBar
Height="100"
IsEnabled="False"
IsIndeterminate="True"
Maximum="100"
Minimum="0"
Orientation="Vertical"
Style="{StaticResource SlotProgressBarStyle}"
Value="100" />
</StackPanel>
</StackPanel>
<Grid Grid.Column="1" Panel.ZIndex="10">
<n:Spin Spinning="{Binding ElementName=IsSpining, Path=IsChecked}" Tip="加载中...">
<StackPanel x:Name="SpinPanel">
<CheckBox x:Name="ProgressCheckbox" Content="进度待定" />
<Slider
x:Name="ProgressSlider"
Maximum="100"
Minimum="0"
Value="25" />
<Slider
x:Name="ProgressTickSlider"
Maximum="100"
Minimum="0"
TickFrequency="10"
TickPlacement="TopLeft" />
<Slider
x:Name="ProgressSlider1"
IsEnabled="False"
Maximum="100"
Minimum="0"
Value="25" />
<ProgressBar
IsIndeterminate="{Binding ElementName=ProgressCheckbox, Path=IsChecked}"
Maximum="100"
Minimum="0"
Style="{StaticResource SlotProgressBarStyle}"
Value="{Binding ElementName=ProgressSlider, Path=Value}" />
<ProgressBar
IsEnabled="False"
IsIndeterminate="{Binding ElementName=ProgressCheckbox, Path=IsChecked}"
Maximum="100"
Minimum="0"
Style="{StaticResource SlotProgressBarStyle}"
Value="{Binding ElementName=ProgressSlider, Path=Value}" />
</StackPanel>
</n:Spin>
<n:Spin
HorizontalAlignment="Left"
Spinning="{Binding ElementName=IsSpining, Path=IsChecked}"
Tip="加载中...">
<n:Spin.Indicator>
<n:IconElement Symbol="Downloading" />
</n:Spin.Indicator>
</n:Spin>
</Grid>
</Grid>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="列表框 ListBox" Header="ListBox">
<n:StackPanel Orientation="Horizontal" Spacing="3">
<n:StackPanel Spacing="10">
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:BehaviorAssist.EnableSlideAnimation="True"
SelectedIndex="1"
Style="{StaticResource SlideTabGroupListBoxStyle}">
<!-- 这里是你的数据项 -->
<sys:String>Tab 1</sys:String>
<sys:String>Tab 2</sys:String>
<sys:String>Tab 3</sys:String>
<sys:String>Another Tab</sys:String>
</ListBox>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:BehaviorAssist.EnableSlideAnimation="True"
IsEnabled="False"
SelectedIndex="1"
Style="{StaticResource SlideTabGroupListBoxStyle}">
<!-- 这里是你的数据项 -->
<sys:String>Tab 1</sys:String>
<sys:String>Tab 2</sys:String>
<sys:String>Tab 3</sys:String>
<sys:String>Another Tab</sys:String>
</ListBox>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:BehaviorAssist.EnableSlideAnimation="True"
SelectedIndex="1"
Style="{StaticResource EmbossChipListBoxStyle}">
<!-- 这里是你的数据项 -->
<sys:String>Tab 1</sys:String>
<sys:String>Tab 2</sys:String>
<sys:String>Tab 3</sys:String>
<sys:String>Another Tab</sys:String>
</ListBox>
</n:StackPanel>
<n:StackPanel Orientation="Horizontal" Spacing="3">
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:ControlAssist.Orientation="Vertical"
SelectedIndex="1"
SelectionMode="Multiple"
Style="{StaticResource SlotTabGroupListBoxStyle}">
<ListBoxItem Content="Home" />
<ListBoxItem Content="Away" />
<ListBoxItem Content="Night" />
</ListBox>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:ControlAssist.Orientation="Vertical"
IsEnabled="False"
SelectedIndex="1"
Style="{StaticResource SlotTabGroupListBoxStyle}">
<ListBoxItem Content="Home" />
<ListBoxItem Content="Away" />
<ListBoxItem Content="Night" />
</ListBox>
<ListBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
n:BehaviorAssist.EnableSlideAnimation="True"
n:ControlAssist.Orientation="Vertical"
SelectedIndex="0"
SelectionMode="Multiple"
Style="{StaticResource SlideTabGroupListBoxStyle}">
<!-- 这里是你的数据项 -->
<sys:String>Tab 1</sys:String>
<sys:String>Tab 2</sys:String>
<sys:String>Tab 3</sys:String>
</ListBox>
</n:StackPanel>
</n:StackPanel>
</GroupBox>
<GroupBox n:ControlAssist.AnchorHeaderText="折叠 Accordion" Header="Accordion">
<n:Accordion
Width="200"
BorderThickness="1"
Style="{StaticResource EmbossAccordionStyle}">
<n:AccordionItem Header="User Profile" IsExpanded="True">
<StackPanel Margin="10">
<TextBlock Text="Name: John Doe" />
<TextBlock Text="Email: john.doe@example.com" />
</StackPanel>
</n:AccordionItem>
<n:AccordionItem Header="User Profile">
<StackPanel Margin="10">
<TextBlock Text="Name: John Doe" />
<TextBlock Text="Email: john.doe@example.com" />
</StackPanel>
</n:AccordionItem>
<n:AccordionItem Header="User Profile">
<StackPanel Margin="10">
<TextBlock Text="Name: John Doe" />
<TextBlock Text="Email: john.doe@example.com" />
</StackPanel>
</n:AccordionItem>
<n:AccordionItem Header="Application Settings">
<StackPanel>
<CheckBox Content="Enable Dark Mode" />
<CheckBox Content="Auto-save every 5 minutes" />
</StackPanel>
</n:AccordionItem>
<n:AccordionItem Header="Help &amp; Support">
<TextBlock
Margin="10"
Text="For support, please visit our website."
TextWrapping="Wrap" />
</n:AccordionItem>
</n:Accordion>
</GroupBox>
</n:StackPanel>
</n:Anchor>
</Grid>
</n:NeoWindow>

View File

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