Avaloniaでのログイン画面実装

ログイン画面のXAML実装

Avaloniaにおけるログイン画面の実装例を示します。画像とアイコンフォントを使用するため、リソースへの追加とApp.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"
        mc:Ignorable="d" 
        x:Class="LoginApp.Views.LoginView"
        xmlns:vm="using:LoginApp.ViewModels"
        x:DataType="vm:LoginViewModel"
        Title="ユーザー認証" 
        Width="800" 
        Height="500" 
        WindowStartupLocation="CenterScreen" 
        Icon="/Assets/app-icon.ico">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="300"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <!-- 認証フォーム -->
        <Grid Grid.Column="0">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <TextBlock Grid.Row="0" 
                       Text="システムログイン"
                       FontSize="28"
                       HorizontalAlignment="Center"
                       Margin="0,40"/>

            <Image Grid.Row="1" 
                   Source="/Assets/LoginIcon.png"
                   Width="80"
                   HorizontalAlignment="Center"
                   Margin="0,20"/>

            <StackPanel Grid.Row="2" Margin="20,30">
                <TextBox Name="UsernameInput" 
                         Watermark="ユーザー名"
                         Text="{Binding Username}"
                         Height="40"
                         FontSize="18"/>
                <TextBox Name="PasswordInput" 
                         Watermark="パスワード"
                         PasswordChar="*"
                         Text="{Binding Password}"
                         Margin="0,15,0,0"
                         Height="40"
                         FontSize="18"/>
            </StackPanel>

            <StackPanel Grid.Row="3">
                <CheckBox Content="認証情報を保存"
                          Margin="20,10"/>
                <Button Content="ログイン実行"
                         Command="{Binding LoginCommand}"
                         Background="#0066CC"
                         Foreground="White"
                         FontSize="20"
                         Height="45"
                         CornerRadius="5"
                         Margin="40,20"/>
            </StackPanel>
        </Grid>

        <!-- サイドバナー -->
        <Border Grid.Column="1" 
                BorderThickness="1,0,0,0" 
                BorderBrush="#0099FF">
            <Image Source="/Assets/LoginBanner.png"/>
        </Border>
    </Grid>
</Window>

ビューモデルの実装

using Avalonia.Controls;
using System.Collections.ObjectModel;

namespace LoginApp.ViewModels
{
    public class LoginViewModel : ViewModelBase
    {
        public string Username { get; set; }
        public string Password { get; set; }
        
        public ObservableCollection<UserAccount> Accounts { get; }

        private readonly Window _currentWindow;
        
        public LoginViewModel(Window window)
        {
            Accounts = new ObservableCollection<UserAccount>
            {
                new UserAccount { Id = 1001, Name = "user1", Passcode = "pass1" },
                new UserAccount { Id = 1002, Name = "user2", Passcode = "pass2" }
            };
            
            Username = Accounts[0].Name;
            Password = Accounts[0].Passcode;
            
            LoginCommand = new RelayCommand(ExecuteLogin);
            _currentWindow = window;
        }

        public ICommand LoginCommand { get; }

        private void ExecuteLogin(object parameter)
        {
            // 認証処理
            var mainWindow = new MainWindow();
            mainWindow.Show();
            _currentWindow.Close();
        }
    }
}

ユーザーエンティティクラス

namespace LoginApp.Models
{
    public class UserAccount
    {
        public long Id { get; set; }
        public string Name { get; set; } = string.Empty;
        public string Passcode { get; set; } = string.Empty;
    }
}

コマンド実装

using System;
using System.Windows.Input;

namespace LoginApp.Core
{
    public class RelayCommand : ICommand
    {
        private readonly Action<object> _executeAction;
        
        public event EventHandler CanExecuteChanged;

        public RelayCommand(Action<object> execute)
        {
            _executeAction = execute;
        }

        public bool CanExecute(object parameter) => true;

        public void Execute(object parameter)
        {
            _executeAction?.Invoke(parameter);
        }
    }
}

タグ: AvaloniaUI XAML MVVM 認証

6月4日 22:06 投稿