项目结构

小技巧,修改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="&#xe604;" 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="&#xe8cc;" 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;
        }
    }
} 

 运行效果

 

posted on 2025-07-05 15:18  dalgleish  阅读(143)  评论(0)    收藏  举报