项目结构

小技巧,修改AvaloniaUI.csproj,让下面代码替换所有ItemGroup。这样的好处是,以后Resources下建立的xaml,默认是AvaloniaResource,然后Resource\Xamls下的,是正常文件。
<ItemGroup> <AvaloniaResource Include="Resources\**" /> <AvaloniaResource Remove="Resources\Xamls\**" /> </ItemGroup>
IconFont.ttf是来自于https://www.iconfont.cn/,下载后,添加到资源。App.axaml
<Application xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="AvaloniaUI.App" RequestedThemeVariant="Default"> <!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. --> <Application.Styles> <SimpleTheme /> </Application.Styles> <Application.Resources> <ResourceDictionary> <FontFamily x:Key="IconFont">avares://AvaloniaUI/Resources/Fonts/IconFont.ttf#IconFont</FontFamily> <FontFamily x:Key="Bayern">avares://AvaloniaUI/Resources/Fonts/Bayern.ttf#Bayern</FontFamily> <ResourceDictionary.MergedDictionaries> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
AvaloniaExtension.cs是扩展如下(随时更新)
https://www.cnblogs.com/dalgleish/p/18972924
Main.axaml
<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" xmlns:local ="using:AvaloniaMVVM" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="AvaloniaUI.Main" Title="AvaloniaUI"> <SplitView DisplayMode="CompactInline" Background="White" x:DataType="local:MainViewModel" IsPaneOpen="{Binding IsPaneOpen}" OpenPaneLength="280" CompactPaneLength="36"> <SplitView.Pane> <StackPanel Spacing="5" Margin="5"> <Grid ColumnDefinitions="auto,*"> <Button Command ="{Binding OpenPaneCommand}" Content="" FontFamily="{StaticResource IconFont}" FontSize="16"/> <Rectangle Grid.Column="1" Fill="WhiteSmoke" Margin="1"/> </Grid> <ListBox Background="Transparent" BorderBrush="Transparent" IsEnabled="{Binding $parent[Window].((local:MainViewModel)DataContext).IsPaneOpen}" ItemsSource="{Binding AxamlList}" SelectionChanged="ListBox_SelectionChanged"> <ListBox.ItemTemplate> <DataTemplate> <Grid ColumnDefinitions="auto,*"> <Label Content="" FontFamily="{StaticResource IconFont}" FontSize="16" Margin="-5,0,5,0" IsVisible="{Binding !$parent[Window].((local:MainViewModel)DataContext).IsPaneOpen}"/> <TextBlock Grid.Column="1" Text="{Binding .}" HorizontalAlignment="Center"/> </Grid> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel> </SplitView.Pane> <SplitView.Content> <UserControl Content="{Binding Content}"/> </SplitView.Content> </SplitView> </Window>
Main.axaml.cs
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using AvaloniaMVVM;
using Shares.Avalonia;
using System;
namespace AvaloniaUI
{
public partial class Main : Window
{
public Main()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
private async void ListBox_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
{
//单选
((MainViewModel)this.DataContext!).Content = await this.RunResourceAsync((string)e.AddedItems[0]!);
}
}
}
}
MainViewModel.cs
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Layout;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AvaloniaMVVM
{
public partial class MainViewModel : ObservableObject
{
[ObservableProperty]
private bool _isPaneOpen = false;
[ObservableProperty]
private object? _content = null;
public ObservableCollection<string> AxamlList
{
get; set;
} = new ObservableCollection<string>();
public MainViewModel()
{
AxamlList.Add("EightBall");
AxamlList.Add("NonCompiledXaml");
}
[RelayCommand]
private void OpenPane()
{
IsPaneOpen = !IsPaneOpen;
}
}
}
运行效果

浙公网安备 33010602011771号