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

Avalonia音乐商店教程问题:按钮点击无法打开对话框

Avalonia UI音乐商店教程对话框无法弹出问题

正在跟随Avalonia UI音乐商店应用教程学习,卡在打开对话框的步骤。点击按钮时对话框始终无法弹出,已尝试更新过期的Avalonia包但无效果;添加调试语句确认按钮点击事件已触发,可对话框仍不弹出。

现有代码

MainWindowViewModel.cs

using System;
using System.Windows.Input;
using ReactiveUI;

namespace Avalonia.MusicStore.ViewModels;

public class MainWindowViewModel : ViewModelBase
{
    public MainWindowViewModel()
    {
        ShowDialog = new Interaction<MusicStoreViewModel, AlbumViewModel?>();
        BuyMusicCommand = ReactiveCommand.Create((() =>
        {
            Console.WriteLine("Open dialog");
            MusicStoreViewModel store = new MusicStoreViewModel();
            IObservable<AlbumViewModel?> result = ShowDialog.Handle(store);
        }));
    }
    
    public ICommand BuyMusicCommand { get; }
    
    public Interaction<MusicStoreViewModel, AlbumViewModel?> ShowDialog { get; }
}

MainWindow.axaml

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:Avalonia.MusicStore.ViewModels"
        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="Avalonia.MusicStore.Views.MainWindow"
        x:DataType="vm:MainWindowViewModel"
        Icon="/Assets/avalonia-logo.ico"
        Title="Avalonia.MusicStore"
        TransparencyLevelHint="AcrylicBlur"
        Background="Transparent"
        ExtendClientAreaToDecorationsHint="True"
        WindowStartupLocation="CenterScreen">

        <Panel>
            <ExperimentalAcrylicBorder IsHitTestVisible="False">
                <ExperimentalAcrylicBorder.Material>
                    <ExperimentalAcrylicMaterial
                        BackgroundSource="Digger"
                        TintColor="Black"
                        TintOpacity="1"
                        MaterialOpacity="0.65" />
                </ExperimentalAcrylicBorder.Material>
            </ExperimentalAcrylicBorder>
            
            <Panel Margin="40">
                <Button HorizontalAlignment="Right"
                        VerticalAlignment="Top"
                        Command="{Binding BuyMusicCommand}">
                    <PathIcon Data="{StaticResource store_microsoft_regular}"/>
                </Button>
            </Panel>
            
        </Panel>

</Window>

MainWindow.axaml.cs

using System.Threading.Tasks;
using Avalonia.MusicStore.ViewModels;
using Avalonia.ReactiveUI;
using ReactiveUI;

namespace Avalonia.MusicStore.Views;

public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
{
    public MainWindow()
    {
        InitializeComponent();
        this.WhenActivated(action => action(ViewModel!.ShowDialog.RegisterHandler(DoShowDialogAsync)));
    }

    private async Task DoShowDialogAsync(IInteractionContext<MusicStoreViewModel, AlbumViewModel?> interaction)
    {
        MusicStoreWindow dialog = new MusicStoreWindow();
        dialog.DataContext = interaction.Input;
        
        AlbumViewModel? result = await dialog.ShowDialog<AlbumViewModel?>(this);
        interaction.SetOutput(result);
    }
}

问题排查与解决方案

  • 订阅交互的Observable:ShowDialog.Handle(store)返回的是冷Observable,只有被订阅后才会触发交互流程。修改BuyMusicCommand的实现,使用await订阅(或者手动调用Subscribe):

    BuyMusicCommand = ReactiveCommand.Create(async () =>
    {
        Console.WriteLine("Open dialog");
        MusicStoreViewModel store = new MusicStoreViewModel();
        var result = await ShowDialog.Handle(store);
        // 可在此处理对话框返回的结果
    });
    

    原代码仅创建了Observable但未订阅,导致对话框逻辑未执行。

  • 验证MusicStoreWindow的有效性:确认MusicStoreWindow的XAML布局是否合理(比如是否有可见内容、窗口尺寸是否不为0),且其代码后台是否正确继承自ReactiveWindow<MusicStoreViewModel>。

  • 确认交互注册是否生效:在DoShowDialogAsync方法开头添加调试输出(如Console.WriteLine("Dialog handler triggered")),检查是否进入该方法。若未进入,需确认MainWindow的ViewModel是否正确绑定,以及WhenActivated的注册逻辑是否正常执行。

  • 检查窗口父级状态:确保调用dialog.ShowDialog(this)时,MainWindow实例已正确初始化并处于激活状态,避免因父窗口无效导致对话框无法弹出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:14:53