项目初始化

This commit is contained in:
2025-09-30 14:35:09 +08:00
commit 0744b61f89
19 changed files with 977 additions and 0 deletions

View 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>

View 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;
}
}
}

View 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>

View File

@@ -0,0 +1,11 @@
using Avalonia.Controls;
namespace AvaloniaLinuxForm.Views;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}

View 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>

View 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>
}
}
}