You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Avalonia UI实现窗口间导航跳转?

在Avalonia中实现按钮跳转至另一个窗口的方法

和Android中跳转Activity的逻辑类似,Avalonia里可以通过两种常见方式实现按钮打开新窗口的功能,以下是具体步骤:

方式一:直接绑定Click事件(类似Android的onClick)

适合简单界面场景,逻辑直接写在窗口代码中,操作直观。

1. 修改AXAML的按钮绑定

把按钮的Command属性替换为Click事件,绑定到窗口的处理方法:

<Button 
    Content="Window2" 
    HorizontalAlignment="Center" 
    Margin="10"
    Click="goToWindow2"/>

2. 实现点击处理逻辑

修改MainWindow.cs中的方法,添加事件参数并完成窗口跳转:

using Avalonia.Controls;
using Avalonia.Interactivity;

namespace AvaloniaProgram
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        // 注意添加事件参数,匹配Click事件的签名
        public void goToWindow2(object sender, RoutedEventArgs e)
        {
            // 实例化第二个窗口并显示
            var window2 = new Window2();
            window2.Show();
            
            // 若需要关闭当前窗口,可添加此行代码
            // this.Close();
        }
    }
}

方式二:使用Command绑定(MVVM模式)

如果项目遵循MVVM架构,或希望界面与逻辑解耦,可以用这种方式,对应你原本AXAML中的写法。

1. 实现Command逻辑

首先将窗口的DataContext指向自身(或对应的ViewModel),然后实现ICommand类型的命令。可以自定义实现,也可以用第三方库简化开发。

方法A:自定义RelayCommand

using Avalonia.Controls;
using System;
using System.Windows.Input;

namespace AvaloniaProgram
{
    public partial class MainWindow : Window
    {
        public ICommand GoToWindow2 { get; }

        public MainWindow()
        {
            InitializeComponent();
            // 设置DataContext为自身,让Binding能找到Command
            DataContext = this;
            GoToWindow2 = new RelayCommand(ExecuteGoToWindow2);
        }

        private void ExecuteGoToWindow2()
        {
            var window2 = new Window2();
            window2.Show();
        }
    }

    // 自定义RelayCommand实现ICommand接口
    public class RelayCommand : ICommand
    {
        private readonly Action _execute;
        private readonly Func<bool>? _canExecute;

        public RelayCommand(Action execute, Func<bool>? canExecute = null)
        {
            _execute = execute ?? throw new ArgumentNullException(nameof(execute));
            _canExecute = canExecute;
        }

        public event EventHandler? CanExecuteChanged;

        public bool CanExecute(object? parameter) => _canExecute?.Invoke() ?? true;

        public void Execute(object? parameter) => _execute();
    }
}

方法B:使用CommunityToolkit.Mvvm(推荐)

先通过NuGet安装CommunityToolkit.Mvvm包,直接使用内置的RelayCommand:

using Avalonia.Controls;
using CommunityToolkit.Mvvm.Input;

namespace AvaloniaProgram
{
    public partial class MainWindow : Window
    {
        public ICommand GoToWindow2 { get; }

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            GoToWindow2 = new RelayCommand(ExecuteGoToWindow2);
        }

        private void ExecuteGoToWindow2()
        {
            var window2 = new Window2();
            window2.Show();
        }
    }
}

2. 保持AXAML的Command绑定

原有AXAML代码无需修改,绑定会自动匹配对应的命令:

<Button 
    Content="Window2" 
    HorizontalAlignment="Center" 
    Margin="10"
    Command="{Binding GoToWindow2}"/>

补充说明

  • 若需要打开模态窗口(阻塞当前窗口操作,直到新窗口关闭),可将window2.Show()替换为window2.ShowDialog(this)。
  • 类比Android实现:Android通过Intent启动新Activity,Avalonia则直接实例化Window对象并调用显示方法,核心都是创建并展示新的界面容器。

内容的提问来源于stack exchange,提问作者Beetle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:17:52