项目初始化
This commit is contained in:
10
AvaloniaLinuxForm/App.axaml
Normal file
10
AvaloniaLinuxForm/App.axaml
Normal file
@@ -0,0 +1,10 @@
|
||||
<Application xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
x:Class="AvaloniaLinuxForm.App"
|
||||
RequestedThemeVariant="Default">
|
||||
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
|
||||
|
||||
<Application.Styles>
|
||||
<FluentTheme />
|
||||
</Application.Styles>
|
||||
</Application>
|
49
AvaloniaLinuxForm/App.axaml.cs
Normal file
49
AvaloniaLinuxForm/App.axaml.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Markup.Xaml;
|
||||
|
||||
using AvaloniaLinuxForm.ViewModels;
|
||||
using AvaloniaLinuxForm.Views;
|
||||
using AvaloniaWebView;
|
||||
|
||||
namespace AvaloniaLinuxForm;
|
||||
|
||||
public partial class App : Application
|
||||
{
|
||||
public override void Initialize()
|
||||
{
|
||||
AvaloniaXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
public override void OnFrameworkInitializationCompleted()
|
||||
{
|
||||
// 初始化数据库
|
||||
SQLiteUtil.InitDatabase();
|
||||
|
||||
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||
{
|
||||
desktop.MainWindow = new MainWindow
|
||||
{
|
||||
DataContext = new MainViewModel()
|
||||
};
|
||||
}
|
||||
else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
|
||||
{
|
||||
singleViewPlatform.MainView = new MainView
|
||||
{
|
||||
DataContext = new MainViewModel()
|
||||
};
|
||||
}
|
||||
|
||||
base.OnFrameworkInitializationCompleted();
|
||||
}
|
||||
|
||||
public override void RegisterServices()
|
||||
{
|
||||
base.RegisterServices();
|
||||
|
||||
// if you use only WebView
|
||||
AvaloniaWebViewBuilder.Initialize(default);
|
||||
}
|
||||
|
||||
}
|
BIN
AvaloniaLinuxForm/Assets/avalonia-logo.ico
Normal file
BIN
AvaloniaLinuxForm/Assets/avalonia-logo.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 172 KiB |
26
AvaloniaLinuxForm/AvaloniaLinuxForm.csproj
Normal file
26
AvaloniaLinuxForm/AvaloniaLinuxForm.csproj
Normal file
@@ -0,0 +1,26 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>disable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<AvaloniaResource Include="Assets\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia" Version="$(AvaloniaVersion)" />
|
||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="$(AvaloniaVersion)" />
|
||||
<PackageReference Include="Avalonia.Fonts.Inter" Version="$(AvaloniaVersion)" />
|
||||
<PackageReference Include="Avalonia.ReactiveUI" Version="$(AvaloniaVersion)" />
|
||||
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)" />
|
||||
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.8" />
|
||||
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="3.0.1" />
|
||||
<PackageReference Include="SQLitePCLRaw.lib.e_sqlite3.linux" Version="1.1.14" />
|
||||
<PackageReference Include="WebView.Avalonia" Version="11.0.0.1" />
|
||||
<PackageReference Include="WebView.Avalonia.Desktop" Version="11.0.0.1" />
|
||||
<PackageReference Include="WebView.Avalonia.Linux" Version="11.0.0.1" />
|
||||
</ItemGroup>
|
||||
</Project>
|
94
AvaloniaLinuxForm/SQLiteUtil.cs
Normal file
94
AvaloniaLinuxForm/SQLiteUtil.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using Microsoft.Data.Sqlite;
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace AvaloniaLinuxForm
|
||||
{
|
||||
public class SQLiteUtil
|
||||
{
|
||||
public static string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
|
||||
public static string dbFolderPath = Path.Combine(appDataPath, "SygAvalonia");
|
||||
public static string dbFilePath = Path.Combine(dbFolderPath, "database.sqlite");
|
||||
|
||||
public static void InitDatabase()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!Directory.Exists(dbFolderPath))
|
||||
{
|
||||
Directory.CreateDirectory(dbFolderPath);
|
||||
}
|
||||
// 创建数据库连接(如果文件不存在,会自动创建)
|
||||
using (SqliteConnection connection = new SqliteConnection($"Data Source={dbFilePath};"))
|
||||
{
|
||||
connection.Open();
|
||||
|
||||
// 初始化系统配置表结构
|
||||
string createTableQuery = @"
|
||||
CREATE TABLE IF NOT EXISTS program_config (
|
||||
Id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
Url TEXT NOT NULL
|
||||
);";
|
||||
using (SqliteCommand command = new SqliteCommand(createTableQuery, connection))
|
||||
{
|
||||
int result = command.ExecuteNonQuery();
|
||||
string configCountQuery = @"select count(0) from program_config;";
|
||||
using (SqliteCommand configCountCommand = new SqliteCommand(configCountQuery, connection))
|
||||
using (SqliteDataReader reader = configCountCommand.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
int configCount = reader.GetInt32(0);
|
||||
if (configCount == 0)
|
||||
{
|
||||
// 初始化系统配置数据
|
||||
string initConfigDataQuery = @"insert into program_config (Url) values('https://www.baidu.com');";
|
||||
using (SqliteCommand dataCommand = new SqliteCommand(initConfigDataQuery, connection))
|
||||
{
|
||||
dataCommand.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
connection.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("数据库初始化失败:" + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
// 保存url
|
||||
public static void SaveUrl(string url)
|
||||
{
|
||||
using var connection = new SqliteConnection($"Data Source={dbFilePath}");
|
||||
connection.Open();
|
||||
var cmd = connection.CreateCommand();
|
||||
cmd.CommandText = "update program_config set Url = $Url where id = '1'";
|
||||
cmd.Parameters.AddWithValue("$Url", url);
|
||||
cmd.ExecuteNonQuery();
|
||||
connection.Close();
|
||||
}
|
||||
|
||||
// 加载保存的url
|
||||
public static string LoadUrl()
|
||||
{
|
||||
using var connection = new SqliteConnection($"Data Source={dbFilePath}");
|
||||
connection.Open();
|
||||
|
||||
var cmd = connection.CreateCommand();
|
||||
cmd.CommandText = "SELECT Url FROM program_config where id='1'";
|
||||
|
||||
using var reader = cmd.ExecuteReader();
|
||||
if (reader.Read())
|
||||
{
|
||||
return reader.GetString(0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
25
AvaloniaLinuxForm/ViewModels/MainViewModel.cs
Normal file
25
AvaloniaLinuxForm/ViewModels/MainViewModel.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using AvaloniaWebView;
|
||||
using ReactiveUI;
|
||||
using System;
|
||||
|
||||
namespace AvaloniaLinuxForm.ViewModels;
|
||||
|
||||
public class MainViewModel : ViewModelBase
|
||||
{
|
||||
private bool _canGoBack;
|
||||
public bool CanGoBack
|
||||
{
|
||||
get => _canGoBack;
|
||||
set => this.RaiseAndSetIfChanged(ref _canGoBack, value);
|
||||
}
|
||||
|
||||
private bool _canGoForward;
|
||||
public bool CanGoForward
|
||||
{
|
||||
get => _canGoForward;
|
||||
set => this.RaiseAndSetIfChanged(ref _canGoForward, value);
|
||||
}
|
||||
}
|
7
AvaloniaLinuxForm/ViewModels/ViewModelBase.cs
Normal file
7
AvaloniaLinuxForm/ViewModels/ViewModelBase.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
using ReactiveUI;
|
||||
|
||||
namespace AvaloniaLinuxForm.ViewModels;
|
||||
|
||||
public class ViewModelBase : ReactiveObject
|
||||
{
|
||||
}
|
50
AvaloniaLinuxForm/Views/MainView.axaml
Normal file
50
AvaloniaLinuxForm/Views/MainView.axaml
Normal file
@@ -0,0 +1,50 @@
|
||||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:vm="clr-namespace:AvaloniaLinuxForm.ViewModels"
|
||||
xmlns:webview="clr-namespace:WebView.Avalonia;assembly=WebView.Avalonia"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||
x:Class="AvaloniaLinuxForm.Views.MainView"
|
||||
x:DataType="vm:MainViewModel">
|
||||
<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:MainViewModel />
|
||||
</Design.DataContext>
|
||||
|
||||
<Grid>
|
||||
<!-- 定义两行布局 -->
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="40"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- 工具栏 -->
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
|
||||
<Button x:Name="backButton" Content="后退"
|
||||
HorizontalContentAlignment="Center"
|
||||
VerticalContentAlignment="Center"
|
||||
Width="50"
|
||||
Margin="5" IsEnabled="{Binding CanGoBack}"/>
|
||||
<Button x:Name="forwardButton" Content="前进"
|
||||
HorizontalContentAlignment="Center"
|
||||
VerticalContentAlignment="Center"
|
||||
Width="50"
|
||||
Margin="5" IsEnabled="{Binding CanGoForward}"/>
|
||||
<Button x:Name="refreshButton" Content="刷新"
|
||||
HorizontalContentAlignment="Center"
|
||||
VerticalContentAlignment="Center"
|
||||
Width="50"
|
||||
Margin="5"/>
|
||||
<Button x:Name="settingButton" Content="设置"
|
||||
HorizontalContentAlignment="Center"
|
||||
VerticalContentAlignment="Center"
|
||||
Width="50"
|
||||
Margin="5"/>
|
||||
</StackPanel>
|
||||
|
||||
<WebView x:Name="webView" Grid.Row="1"/>
|
||||
</Grid>
|
||||
|
||||
</UserControl>
|
88
AvaloniaLinuxForm/Views/MainView.axaml.cs
Normal file
88
AvaloniaLinuxForm/Views/MainView.axaml.cs
Normal file
@@ -0,0 +1,88 @@
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.VisualTree;
|
||||
using AvaloniaLinuxForm.ViewModels;
|
||||
using AvaloniaWebView;
|
||||
using System;
|
||||
|
||||
namespace AvaloniaLinuxForm.Views;
|
||||
|
||||
public partial class MainView : UserControl
|
||||
{
|
||||
private WebView _webView;
|
||||
|
||||
private Button _backButton;
|
||||
|
||||
private Button _forwardButton;
|
||||
|
||||
private Button _refreshButton;
|
||||
|
||||
private Button _settingbButton;
|
||||
public MainView()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
_backButton = this.FindControl<Button>("backButton");
|
||||
_backButton.Click += BackButton_OnClick;
|
||||
|
||||
_forwardButton = this.FindControl<Button>("forwardButton");
|
||||
_forwardButton.Click += ForwardButton_OnClick;
|
||||
|
||||
_refreshButton = this.FindControl<Button>("refreshButton");
|
||||
_refreshButton.Click += RefreshButton_OnClick;
|
||||
|
||||
_settingbButton = this.FindControl<Button>("settingButton");
|
||||
_settingbButton.Click += async (_, __) =>
|
||||
{
|
||||
var settingWindow = new SettingWindow();
|
||||
// 找到 MainView 所在的 Window,作为 owner
|
||||
var parentWindow = this.FindAncestorOfType<Window>();
|
||||
|
||||
// 弹窗并等待结果
|
||||
var result = await settingWindow.ShowDialog<string>(parentWindow);
|
||||
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
{
|
||||
LoadUrl(result);
|
||||
}
|
||||
};
|
||||
|
||||
_webView = this.FindControl<WebView>("webView");
|
||||
|
||||
string url = SQLiteUtil.LoadUrl();
|
||||
LoadUrl(url);
|
||||
|
||||
_webView.NavigationCompleted += (s, e) =>
|
||||
{
|
||||
var vm = this.DataContext as MainViewModel;
|
||||
if (vm != null)
|
||||
{
|
||||
vm.CanGoBack = _webView.IsCanGoBack;
|
||||
vm.CanGoForward = _webView.IsCanGoForward;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public void BackButton_OnClick(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||
{
|
||||
_webView.GoBack();
|
||||
}
|
||||
|
||||
public void ForwardButton_OnClick(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||
{
|
||||
_webView.GoForward();
|
||||
}
|
||||
|
||||
public void RefreshButton_OnClick(object sender, Avalonia.Interactivity.RoutedEventArgs e)
|
||||
{
|
||||
_webView.Reload();
|
||||
}
|
||||
private void LoadUrl(string url)
|
||||
{
|
||||
if (Uri.TryCreate(url, UriKind.Absolute, out var uri))
|
||||
{
|
||||
_webView.Url = uri;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
12
AvaloniaLinuxForm/Views/MainWindow.axaml
Normal file
12
AvaloniaLinuxForm/Views/MainWindow.axaml
Normal file
@@ -0,0 +1,12 @@
|
||||
<Window xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:vm="using:AvaloniaLinuxForm.ViewModels"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:views="clr-namespace:AvaloniaLinuxForm.Views"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||
x:Class="AvaloniaLinuxForm.Views.MainWindow"
|
||||
Icon="/Assets/avalonia-logo.ico"
|
||||
Title="主界面">
|
||||
<views:MainView />
|
||||
</Window>
|
11
AvaloniaLinuxForm/Views/MainWindow.axaml.cs
Normal file
11
AvaloniaLinuxForm/Views/MainWindow.axaml.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using Avalonia.Controls;
|
||||
|
||||
namespace AvaloniaLinuxForm.Views;
|
||||
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
14
AvaloniaLinuxForm/Views/SettingWindow.axaml
Normal file
14
AvaloniaLinuxForm/Views/SettingWindow.axaml
Normal file
@@ -0,0 +1,14 @@
|
||||
<Window xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||
x:Class="AvaloniaLinuxForm.SettingWindow"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
Width="400" Height="150"
|
||||
Title="系统设置">
|
||||
<StackPanel Margin="10" Spacing="10">
|
||||
<TextBox x:Name="urlBox" Watermark="请输入 URL..." />
|
||||
<Button x:Name="saveButton" Content="保存" Width="80" HorizontalAlignment="Right"/>
|
||||
</StackPanel>
|
||||
</Window>
|
34
AvaloniaLinuxForm/Views/SettingWindow.axaml.cs
Normal file
34
AvaloniaLinuxForm/Views/SettingWindow.axaml.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Markup.Xaml;
|
||||
|
||||
namespace AvaloniaLinuxForm;
|
||||
|
||||
public partial class SettingWindow : Window
|
||||
{
|
||||
private TextBox _urlBox;
|
||||
public SettingWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
_urlBox = this.FindControl<TextBox>("urlBox");
|
||||
var saveButton = this.FindControl<Button>("saveButton");
|
||||
saveButton.Click += SaveButton_Click;
|
||||
|
||||
// Ĭ<>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD> URL
|
||||
var savedUrl = SQLiteUtil.LoadUrl();
|
||||
if (!string.IsNullOrEmpty(savedUrl))
|
||||
{
|
||||
_urlBox.Text = savedUrl;
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(_urlBox.Text))
|
||||
{
|
||||
SQLiteUtil.SaveUrl(_urlBox.Text);
|
||||
this.Close(_urlBox.Text); // <20><><EFBFBD><EFBFBD> URL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user