feat: simplify MainView.

(cherry picked from commit faee95f12f)
This commit is contained in:
Zhang Dian
2024-11-24 20:52:39 +08:00
parent 237fe72475
commit eb1748aa2a
7 changed files with 159 additions and 92 deletions

View File

@@ -1,8 +1,13 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Input;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Styling;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
namespace Semi.Avalonia.Demo.Views;
@@ -11,31 +16,65 @@ public partial class MainView : UserControl
public MainView()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
}
public partial class MainViewModel : ObservableObject
{
public string DocumentationUrl => "https://docs.irihi.tech/semi";
public string RepoUrl => "https://github.com/irihitech/Semi.Avalonia";
public IReadOnlyList<MenuItemViewModel> MenuItems { get; }
public MainViewModel()
{
MenuItems = [];
}
private void ToggleButton_OnIsCheckedChanged(object sender, RoutedEventArgs e)
[RelayCommand]
private void ToggleTheme()
{
var app = Application.Current;
if (app is null) return;
var theme = app.ActualThemeVariant;
app.RequestedThemeVariant = theme == ThemeVariant.Dark ? ThemeVariant.Light : ThemeVariant.Dark;
}
[RelayCommand]
private void SelectTheme(object? obj)
{
var app = Application.Current;
if (app is not null)
{
var theme = app.ActualThemeVariant;
app.RequestedThemeVariant = theme == ThemeVariant.Dark ? ThemeVariant.Light : ThemeVariant.Dark;
app.RequestedThemeVariant = obj as ThemeVariant;
}
}
private async void OpenRepository(object sender, RoutedEventArgs e)
[RelayCommand]
private static async Task OpenUrl(string url)
{
var top = TopLevel.GetTopLevel(this);
if (top is null) return;
var launcher = top.Launcher;
await launcher.LaunchUriAsync(new Uri("https://github.com/irihitech/Semi.Avalonia"));
var launcher = ResolveDefaultTopLevel()?.Launcher;
if (launcher is not null)
{
await launcher.LaunchUriAsync(new Uri(url));
}
}
private async void OpenDocumentation(object sender, RoutedEventArgs e)
private static TopLevel? ResolveDefaultTopLevel()
{
var top = TopLevel.GetTopLevel(this);
if (top is null) return;
var launcher = top.Launcher;
await launcher.LaunchUriAsync(new Uri("https://docs.irihi.tech/semi"));
return Application.Current?.ApplicationLifetime switch
{
IClassicDesktopStyleApplicationLifetime desktopLifetime => desktopLifetime.MainWindow,
ISingleViewApplicationLifetime singleView => TopLevel.GetTopLevel(singleView.MainView),
_ => null
};
}
}
public class MenuItemViewModel
{
public string? Header { get; set; }
public ICommand? Command { get; set; }
public object? CommandParameter { get; set; }
public IList<MenuItemViewModel>? Items { get; set; }
}