refactor(m0): restructure project and install dependencies

- Clean Avalonia template content (ViewLocator, greeting, empty Models folder)
- Add YKanBan.Tests (MSTest 4.4.1) to solution
- Install packages per plan version table (Semi.Avalonia, Lucide icons,
  Microsoft.Data.Sqlite, Pidgin, Newtonsoft.Json 13.0.4 fallback)
This commit is contained in:
yyc12345 committed 2026-10-01 16:57:12 +08:00
1 parent 6050a70f4b
commit e934eb9629
10 files changed
+41 -58

No files matched your search

+13
View File
@@ -0,0 +1,13 @@
namespace YKanBan.Tests;
[TestClass]
public class SmokeTests
{
[TestMethod]
public void ThirdPartyPackagesResolve()
{
Assert.IsNotNull(typeof(Pidgin.Parser).Assembly);
Assert.IsNotNull(typeof(Newtonsoft.Json.JsonConvert).Assembly);
Assert.IsNotNull(typeof(Microsoft.Data.Sqlite.SqliteConnection).Assembly);
}
}
+16
View File
@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MSTest" Version="4.4.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\YKanBan\YKanBan.csproj" />
</ItemGroup>
</Project>
+1
View File
@@ -1,3 +1,4 @@
<Solution>
<Project Path="YKanBan/YKanBan.csproj" />
<Project Path="YKanBan.Tests/YKanBan.Tests.csproj" />
</Solution>
+1 -7
View File
@@ -1,15 +1,9 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="YKanBan.App"
xmlns:local="using:YKanBan"
RequestedThemeVariant="Default">
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
<Application.DataTemplates>
<local:ViewLocator/>
</Application.DataTemplates>
<Application.Styles>
<FluentTheme />
</Application.Styles>
</Application>
</Application>
+2 -6
View File
@@ -1,8 +1,8 @@
using System.Linq;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Data.Core;
using Avalonia.Data.Core.Plugins;
using System.Linq;
using Avalonia.Markup.Xaml;
using YKanBan.ViewModels;
using YKanBan.Views;
@@ -20,8 +20,6 @@ public partial class App : Application
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
// Avoid duplicate validations from both Avalonia and the CommunityToolkit.
// More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins
DisableAvaloniaDataAnnotationValidation();
desktop.MainWindow = new MainWindow
{
@@ -34,14 +32,12 @@ public partial class App : Application
private void DisableAvaloniaDataAnnotationValidation()
{
// Get an array of plugins to remove
var dataValidationPluginsToRemove =
BindingPlugins.DataValidators.OfType<DataAnnotationsValidationPlugin>().ToArray();
// remove each entry found
foreach (var plugin in dataValidationPluginsToRemove)
{
BindingPlugins.DataValidators.Remove(plugin);
}
}
}
}
+2 -6
View File
@@ -1,18 +1,14 @@
using Avalonia;
using System;
using System;
using Avalonia;
namespace YKanBan;
sealed class Program
{
// Initialization code. Don't use any Avalonia, third-party APIs or any
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
[STAThread]
public static void Main(string[] args) => BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
-31
View File
@@ -1,31 +0,0 @@
using System;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
using YKanBan.ViewModels;
namespace YKanBan;
public class ViewLocator : IDataTemplate
{
public Control? Build(object? param)
{
if (param is null)
return null;
var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
var type = Type.GetType(name);
if (type != null)
{
return (Control)Activator.CreateInstance(type)!;
}
return new TextBlock { Text = "Not Found: " + name };
}
public bool Match(object? data)
{
return data is ViewModelBase;
}
}
@@ -2,5 +2,4 @@
public partial class MainWindowViewModel : ViewModelBase
{
public string Greeting { get; } = "Welcome to Avalonia!";
}
-5
View File
@@ -6,15 +6,10 @@
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="YKanBan.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="YKanBan">
<Design.DataContext>
<!-- This only sets the DataContext for the previewer in an IDE,
to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
<vm:MainWindowViewModel/>
</Design.DataContext>
<TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Window>
+6 -2
View File
@@ -9,7 +9,6 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="Models\" />
<AvaloniaResource Include="Assets\**" />
</ItemGroup>
@@ -18,11 +17,16 @@
<PackageReference Include="Avalonia.Desktop" Version="11.3.6" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.6" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.6" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<!--Exclude Avalonia.Diagnostics from Release build output.-->
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.6">
<IncludeAssets Condition="'$(Configuration)' != 'Debug'">None</IncludeAssets>
<PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
</PackageReference>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.1" />
<PackageReference Include="Semi.Avalonia" Version="11.2.1.10" />
<PackageReference Include="IconPacks.Avalonia.Lucide" Version="2.0.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.20" />
<PackageReference Include="Pidgin" Version="3.5.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>
</Project>