Skip to content

Commit 61e6ca3

Browse files
committed
feat: initialize Client.Avalonia.
1 parent b346156 commit 61e6ca3

File tree

12 files changed

+203
-0
lines changed

12 files changed

+203
-0
lines changed

src/Client.Avalonia/App.axaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<Application xmlns="https://github.com/avaloniaui"
2+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
x:Class="Client.Avalonia.App"
4+
xmlns:local="using:Client.Avalonia"
5+
xmlns:semi="https://irihi.tech/semi">
6+
<Application.DataTemplates>
7+
<local:ViewLocator />
8+
</Application.DataTemplates>
9+
10+
<Application.Styles>
11+
<semi:SemiTheme Locale="zh-CN" />
12+
</Application.Styles>
13+
</Application>

src/Client.Avalonia/App.axaml.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using Avalonia;
2+
using Avalonia.Controls.ApplicationLifetimes;
3+
using Avalonia.Data.Core;
4+
using Avalonia.Data.Core.Plugins;
5+
using System.Linq;
6+
using Avalonia.Markup.Xaml;
7+
using Client.Avalonia.ViewModels;
8+
using Client.Avalonia.Views;
9+
10+
namespace Client.Avalonia;
11+
12+
public partial class App : Application
13+
{
14+
public override void Initialize()
15+
{
16+
AvaloniaXamlLoader.Load(this);
17+
}
18+
19+
public override void OnFrameworkInitializationCompleted()
20+
{
21+
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
22+
{
23+
// Avoid duplicate validations from both Avalonia and the CommunityToolkit.
24+
// More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins
25+
DisableAvaloniaDataAnnotationValidation();
26+
desktop.MainWindow = new MainWindow
27+
{
28+
DataContext = new MainWindowViewModel(),
29+
};
30+
}
31+
32+
base.OnFrameworkInitializationCompleted();
33+
}
34+
35+
private void DisableAvaloniaDataAnnotationValidation()
36+
{
37+
// Get an array of plugins to remove
38+
var dataValidationPluginsToRemove =
39+
BindingPlugins.DataValidators.OfType<DataAnnotationsValidationPlugin>().ToArray();
40+
41+
// remove each entry found
42+
foreach (var plugin in dataValidationPluginsToRemove)
43+
{
44+
BindingPlugins.DataValidators.Remove(plugin);
45+
}
46+
}
47+
}
172 KB
Binary file not shown.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<OutputType>WinExe</OutputType>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<Nullable>enable</Nullable>
6+
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
7+
<ApplicationManifest>app.manifest</ApplicationManifest>
8+
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<Folder Include="Models\"/>
13+
<AvaloniaResource Include="Assets\**"/>
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<PackageReference Include="Avalonia" Version="11.2.2"/>
18+
<PackageReference Include="Avalonia.Desktop" Version="11.2.2"/>
19+
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
20+
<PackageReference Include="Avalonia.Diagnostics" Version="11.2.2">
21+
<IncludeAssets Condition="'$(Configuration)' != 'Debug'">None</IncludeAssets>
22+
<PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
23+
</PackageReference>
24+
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.3.2"/>
25+
<PackageReference Include="Semi.Avalonia" Version="11.2.1.1" />
26+
</ItemGroup>
27+
</Project>

src/Client.Avalonia/Program.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Avalonia;
2+
using System;
3+
4+
namespace Client.Avalonia;
5+
6+
sealed class Program
7+
{
8+
// Initialization code. Don't use any Avalonia, third-party APIs or any
9+
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
10+
// yet and stuff might break.
11+
[STAThread]
12+
public static void Main(string[] args) => BuildAvaloniaApp()
13+
.StartWithClassicDesktopLifetime(args);
14+
15+
// Avalonia configuration, don't remove; also used by visual designer.
16+
public static AppBuilder BuildAvaloniaApp()
17+
=> AppBuilder.Configure<App>()
18+
.UsePlatformDetect()
19+
.LogToTrace();
20+
}

src/Client.Avalonia/ViewLocator.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using Avalonia.Controls;
3+
using Avalonia.Controls.Templates;
4+
using Client.Avalonia.ViewModels;
5+
6+
namespace Client.Avalonia;
7+
8+
public class ViewLocator : IDataTemplate
9+
{
10+
public Control? Build(object? param)
11+
{
12+
if (param is null)
13+
return null;
14+
15+
var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
16+
var type = Type.GetType(name);
17+
18+
if (type != null)
19+
{
20+
return (Control)Activator.CreateInstance(type)!;
21+
}
22+
23+
return new TextBlock { Text = "Not Found: " + name };
24+
}
25+
26+
public bool Match(object? data)
27+
{
28+
return data is ViewModelBase;
29+
}
30+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Client.Avalonia.ViewModels;
2+
3+
public partial class MainWindowViewModel : ViewModelBase
4+
{
5+
public string Greeting { get; } = "Welcome to Avalonia!";
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using CommunityToolkit.Mvvm.ComponentModel;
2+
3+
namespace Client.Avalonia.ViewModels;
4+
5+
public class ViewModelBase : ObservableObject
6+
{
7+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Window xmlns="https://github.com/avaloniaui"
2+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
xmlns:vm="using:Client.Avalonia.ViewModels"
4+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
7+
x:Class="Client.Avalonia.Views.MainWindow"
8+
x:DataType="vm:MainWindowViewModel"
9+
Icon="/Assets/avalonia-logo.ico"
10+
Title="Client.Avalonia">
11+
12+
<Design.DataContext>
13+
<vm:MainWindowViewModel />
14+
</Design.DataContext>
15+
16+
<TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center" />
17+
18+
</Window>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Avalonia.Controls;
2+
3+
namespace Client.Avalonia.Views;
4+
5+
public partial class MainWindow : Window
6+
{
7+
public MainWindow()
8+
{
9+
InitializeComponent();
10+
}
11+
}

0 commit comments

Comments
 (0)